Add Artifact Manager service.

Adds a micro service that offers gRPC interface for CBA artifacts manipulation. By default the
service is attached to py-executor but can be ran as a separate service if needed in the future.

Issue-ID: CCSDK-1988
Change-Id: I40e20f085ae1c1e81a48f76dbea181af28d9bd0d
Signed-off-by: Marek Szwalkiewicz <marek.szwalkiewicz@external.t-mobile.pl>
diff --git a/ms/artifact-manager/README b/ms/artifact-manager/README
new file mode 100644
index 0000000..290dadf
--- /dev/null
+++ b/ms/artifact-manager/README
@@ -0,0 +1,199 @@
+# CDS Artifact Manager
+
+Artifact Manager is a very simple gRPC service that lets you upload, download and delete CBA archives. It can be ran as a standalone micro service (using `server.py`) or you can include it's methods in a service like `py-executor`.
+
+## Configuration
+Configuration is stored in `.ini` file, you can specify a path and name of a file using `CONFIGURATION` env variable.
+For possible variables please see example below (with inline comments):
+```
+[artifactManagerServer]
+port=50052                    # A port on which the server will be listening
+logFile=server.log            # Path to a log file
+maxWorkers=20                 # Max number of concurent workers
+debug=true                    # Debug flag
+logConfig=logging.yaml        # A special MDC logger config
+fileRepositoryBasePath=/tmp/  # A FS path where we should store CBA files
+```
+
+## Methods
+Below is a list of gRPC methods handled by the service. The `proto` files are available in `artifact-manager/manager/proto` directory.
+
+All methods expect `CommonHeader` with:
+* `timestamp` - datetime in UTC with this: `%Y-%m-%dT%H:%M:%S.%fZ` format
+* `originatorId` - name of the component (eg. `CDS`)
+* `requestId` - ID of the request
+* `subRequestId` - Sub ID of the request
+* `flag` - TBD
+
+and an `ActionIdentifiers` with following fields:
+* `blueprintName` - name of the blueprint
+* `blueprintVersion` - version number of blueprint (as string)
+* `actionName` - TBD
+* `mode` - TBD
+
+### Upload
+
+Upload `CBA.zip` file for storage in artifact manager. File needs to be sent as a binary data in `fileChunk` field.
+
+#### Example
+
+```
+stub: BluePrintManagementServiceStub = BluePrintManagementServiceStub(channel)
+with  open(file_path, "rb") as cba_file:
+    msg: BluePrintUploadInput = BluePrintUploadInput()
+    msg.actionIdentifiers.blueprintName =  "Test"
+    msg.actionIdentifiers.blueprintVersion =  "0.0.1"
+    msg.fileChunk.chunk = cba_file.read()
+return  stub.uploadBlueprint(msg)
+```
+
+### Download
+
+Download existing `CBA.zip` file.
+
+#### Example
+
+```
+stub: BluePrintManagementServiceStub = BluePrintManagementServiceStub(channel)
+msg: BluePrintDownloadInput = BluePrintDownloadInput()
+msg.actionIdentifiers.blueprintName =  "Test"
+msg.actionIdentifiers.blueprintVersion =  "0.0.1"
+return  stub.downloadBlueprint(msg)
+```
+### Remove
+
+Delete existing `CBA.zip` file.
+
+#### Example
+
+```
+stub: BluePrintManagementServiceStub = BluePrintManagementServiceStub(channel)
+msg: BluePrintRemoveInput = BluePrintRemoveInput()
+msg.actionIdentifiers.blueprintName =  "Test"
+msg.actionIdentifiers.blueprintVersion =  "0.0.1"
+return  stub.removeBlueprint(msg)
+```
+
+## Full gRPC Client Example
+
+```
+import logging
+import sys
+from argparse import ArgumentParser, FileType, Namespace
+from configparser import ConfigParser
+from datetime import datetime
+from pathlib import Path
+
+import zipfile
+
+from grpc import Channel, ChannelCredentials, insecure_channel, secure_channel, ssl_channel_credentials
+
+from proto.BluePrintManagement_pb2 import (
+    BluePrintDownloadInput,
+    BluePrintRemoveInput,
+    BluePrintUploadInput,
+    BluePrintManagementOutput,
+)
+from proto.BluePrintManagement_pb2_grpc import BluePrintManagementServiceStub
+
+
+logging.basicConfig(level=logging.DEBUG)
+
+
+class ClientArgumentParser(ArgumentParser):
+    """Client argument parser.
+
+    It has two arguments:
+     - config_file - provide a path to configuration file. Default is ./configuration-local.ini
+     - actions - list of actions to do by client. It have to be a list of given values: upload, download, remove.
+    """
+
+    DEFAULT_CONFIG_PATH: str = str(Path(__file__).resolve().with_name("configuration-local.ini"))
+
+    def __init__(self, *args, **kwargs):
+        """Initialize argument parser."""
+        super().__init__(*args, **kwargs)
+        self.description: str = "Artifact Manager client example"
+
+        self.add_argument(
+            "--config_file",
+            type=FileType("r"),
+            default=self.DEFAULT_CONFIG_PATH,
+            help="Path to the client configuration file. By default it's `configuration-local.ini` file from Artifact Manager directory",
+        )
+        self.add_argument(
+            "--actions", nargs="+", default=["upload", "download", "remove"], choices=["upload", "download", "remove"]
+        )
+
+
+class Client:
+    """Client class.
+
+    Implements methods which can be called to server.
+    """
+
+    def __init__(self, channel: Channel, config: ConfigParser) -> None:
+        """Initialize client class.
+
+        :param channel: gprc channel object
+        :param config: ConfigParser object with "client" section
+        """
+        self.channel: Channel = channel
+        self.stub: BluePrintManagementServiceStub = BluePrintManagementServiceStub(self.channel)
+        self.config = config
+
+    def upload(self) -> BluePrintManagementOutput:
+        """Prepare upload message and send it to server."""
+        logging.info("Call upload client method")
+        with open(self.config.get("client", "cba_file"), "rb") as cba_file:
+            msg: BluePrintUploadInput = BluePrintUploadInput()
+            msg.actionIdentifiers.blueprintName = "Test"
+            msg.actionIdentifiers.blueprintVersion = "0.0.1"
+            msg.fileChunk.chunk = cba_file.read()
+        return self.stub.uploadBlueprint(msg)
+
+    def download(self) -> BluePrintManagementOutput:
+        """Prepare download message and send it to server."""
+        logging.info("Call download client method")
+        msg: BluePrintDownloadInput = BluePrintDownloadInput()
+        msg.actionIdentifiers.blueprintName = "Test"
+        msg.actionIdentifiers.blueprintVersion = "0.0.1"
+        return self.stub.downloadBlueprint(msg)
+
+    def remove(self) -> BluePrintManagementOutput:
+        """Prepare remove message and send it to server."""
+        logging.info("Call remove client method")
+        msg: BluePrintRemoveInput = BluePrintRemoveInput()
+        msg.actionIdentifiers.blueprintName = "Test"
+        msg.actionIdentifiers.blueprintVersion = "0.0.1"
+        return self.stub.removeBlueprint(msg)
+
+
+if __name__ == "__main__":
+    arg_parser: ClientArgumentParser = ClientArgumentParser()
+    args: Namespace = arg_parser.parse_args()
+
+    config_parser: ConfigParser = ConfigParser()
+    config_parser.read_file(args.config_file)
+
+    server_address: str = f"{config_parser.get('client', 'address')}:{config_parser.get('client', 'port')}"
+    if config_parser.getboolean("client", "use_ssl", fallback=False):
+        logging.info(f"Create secure connection on {server_address}")
+        with open(config_parser.get("client", "private_key_file"), "rb") as private_key_file, open(
+            config_parser.get("client", "certificate_chain_file"), "rb"
+        ) as certificate_chain_file:
+            ssl_credentials: ChannelCredentials = ssl_channel_credentials(
+                private_key=private_key_file.read(), certificate_chain=certificate_chain_file.read()
+            )
+        channel: Channel = secure_channel(server_address, ssl_credentials)
+    else:
+        logging.info(f"Create insecure connection on {server_address}")
+        channel: Channel = insecure_channel(server_address)
+
+    with channel:
+        client: Client = Client(channel, config_parser)
+        for action in args.actions:
+            logging.info("Get response")
+            logging.info(getattr(client, action)())
+
+```
\ No newline at end of file
diff --git a/ms/artifact-manager/manager/__init__.py b/ms/artifact-manager/manager/__init__.py
new file mode 100644
index 0000000..2123690
--- /dev/null
+++ b/ms/artifact-manager/manager/__init__.py
@@ -0,0 +1,14 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
diff --git a/ms/artifact-manager/manager/configuration.py b/ms/artifact-manager/manager/configuration.py
new file mode 100644
index 0000000..0af2c22
--- /dev/null
+++ b/ms/artifact-manager/manager/configuration.py
@@ -0,0 +1,139 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+import logging
+import os
+from configparser import ConfigParser, SectionProxy
+from distutils.util import strtobool
+from logging import Logger
+from pathlib import Path, PurePath
+from typing import NoReturn
+
+from onaplogging import monkey
+from onaplogging.mdcformatter import MDCFormatter  # noqa
+
+monkey.patch_loggingYaml()
+
+
+DEFAUL_CONFIGURATION_FILE: str = str(PurePath(Path().absolute(), "../configuration.ini"))
+SUPPLIED_CONFIGURATION_FILE: str = os.environ.get("CONFIGURATION")
+CONFIGURATION_FILE: str = str(os.path.expanduser(Path(SUPPLIED_CONFIGURATION_FILE or DEFAUL_CONFIGURATION_FILE)))
+
+
+class ArtifactManagerConfiguration:
+    """ServerConfiguration class loads configuration from config INI files."""
+
+    def __init__(self, config_file_path: str) -> NoReturn:
+        """Initialize configuration class instance.
+
+        Configuration is loaded from file provided as a parameter. Environment variables are loaded also.
+        Logger for object is created with the name same as the class name.
+        :param config_file_path: Path to configuration file.
+        """
+        self.config_file_path = config_file_path
+        self.config = ConfigParser(os.environ)
+        self.config.read(config_file_path, encoding="utf-8")
+
+    @property
+    def configuration_directory(self) -> str:
+        """Get directory path to a directory with configuration ini file.
+
+        This is used to handle relative file paths in config file.
+        """
+        return os.path.dirname(self.config_file_path)
+
+    def get_section(self, section_name: str) -> SectionProxy:
+        """Get the section from configuration file.
+
+        :param section_name: Name of the section to get
+        :raises: KeyError
+        :return: SectionProxy object for given section name
+        """
+        return self.config[section_name]
+
+    def __getitem__(self, key: str) -> SectionProxy:
+        """Get the section from configuration file.
+
+        This method just calls the get_section method but allows us to use it as key lookup
+
+        :param section_name: Name of the section to get
+        :raises: KeyError
+        :return: SectionProxy object for given section name
+        """
+        return self.get_section(key)
+
+    def get_property(self, section_name: str, property_name: str) -> str:
+        """Get the property value from *section_name* section.
+
+        :param section_name: Name of the section config file section on which property is set
+        :param property_name: Name of the property to get
+        :raises: configparser.NoOptionError
+        :return: String value of the property
+        """
+        return self.config.get(section_name, property_name)
+
+    def artifact_manager_property(self, property_name: str) -> str:
+        """Get the property value from *artifactManagerServer* section.
+
+        :param property_name: Name of the property to get
+        :raises: configparser.NoOptionError
+        :return: String value of the property
+        """
+        return self.config.get("artifactManagerServer", property_name)
+
+
+config = ArtifactManagerConfiguration(CONFIGURATION_FILE)
+
+
+def prepare_logger(log_file_path: str, development_mode: bool, config: ArtifactManagerConfiguration) -> callable:
+    """Base MDC logger configuration.
+
+    Level depends on the *development_mode* flag: DEBUG if development_mode is set or INFO otherwise.
+    Console handler is created from MDC settings from onappylog library.
+
+    :param log_file_path: Path to the log file, where logs are going to be saved.
+    :param development_mode: Boolean type value which means if logger should be setup in development mode or not
+    :param config: Configuration class so we can fetch app settings (paths) to logger.
+    :return: callable
+    """
+    logging_level: int = logging.DEBUG if development_mode else logging.INFO
+    logging.basicConfig(filename=log_file_path, level=logging_level)
+    logging.config.yamlConfig(
+        filepath=Path(config.configuration_directory, config["artifactManagerServer"]["logConfig"])
+    )
+
+    console: logging.StreamHandler = logging.StreamHandler()
+    console.setLevel(logging_level)
+    formatter: logging.Formatter = MDCFormatter(
+        fmt="%(asctime)s:[%(name)s] %(created)f %(module)s %(funcName)s %(pathname)s %(process)d %(levelno)s :[ %(threadName)s  %(thread)d]: [%(mdc)s]: [%(filename)s]-[%(lineno)d] [%(levelname)s]:%(message)s",  # noqa
+        mdcfmt="{RequestID} {InvocationID} {ServiceName} {PartnerName} {BeginTimestamp} {EndTimestamp} {ElapsedTime} {StatusCode} {TargetEntity} {TargetServiceName} {Server}",  # noqa
+        # Important: We cannot use %f here because this datetime format is used by time library, not datetime.
+        datefmt="%Y-%m-%dT%H:%M:%S%z",
+    )
+    console.setFormatter(formatter)
+
+    def get_logger(name: str) -> Logger:
+        """Get a new logger with predefined MDC handler."""
+        logger: Logger = logging.getLogger(name)
+        logger.addHandler(console)
+        return logger
+
+    return get_logger
+
+
+get_logger = prepare_logger(
+    config.artifact_manager_property("logFile"),
+    strtobool(config["artifactManagerServer"].get("debug", "false")),
+    config,
+)
diff --git a/ms/artifact-manager/manager/errors.py b/ms/artifact-manager/manager/errors.py
new file mode 100644
index 0000000..feafd76
--- /dev/null
+++ b/ms/artifact-manager/manager/errors.py
@@ -0,0 +1,64 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+
+class ArtifactManagerError(Exception):
+    """Base Artifact Manager exception class."""
+
+    status_code: int = 0
+    message: str = "Error"
+
+    def __init__(self, message: str = None) -> None:
+        """Initialize exception with optional message."""
+        if message:
+            self.message: str = message
+
+    @property
+    def status_code(self) -> int:
+        """Artifact Manager error class status code.
+
+        Base class has no and shouldn't have any status code.
+        """
+        if self.status_code == 0:
+            raise NotImplementedError
+        return self.status_code
+
+
+class InvalidRequestError(ArtifactManagerError):
+    """Raised when request has invalid or incomplete data."""
+
+    status_code: int = 500
+    message: str = "Invalid request"
+
+
+class ArtifactNotFoundError(ArtifactManagerError):
+    """Raised when requested artifact doesn't exist in system."""
+
+    status_code: int = 500
+    message: str = "Artifact not found"
+
+
+class ArtifactIOError(ArtifactManagerError):
+    """Raised on input/output error."""
+
+    status_code: int = 500
+    message: str = "Artifact is corrupted"
+
+
+class ArtifactOverwriteError(ArtifactManagerError):
+    """Raised when we cannot remove old artifact to save new."""
+
+    status_code: int = 500
+    message: str = "Artifact already exists and cannot be overwritten"
diff --git a/ms/artifact-manager/manager/servicer.py b/ms/artifact-manager/manager/servicer.py
new file mode 100644
index 0000000..be740b0
--- /dev/null
+++ b/ms/artifact-manager/manager/servicer.py
@@ -0,0 +1,237 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+import socket
+from datetime import datetime, timezone
+from functools import wraps
+from logging import Logger
+from typing import NoReturn, Union
+
+from grpc import ServicerContext
+from manager.configuration import get_logger
+from manager.errors import ArtifactManagerError, InvalidRequestError
+from manager.utils import Repository, RepositoryStrategy
+from onaplogging.mdcContext import MDC
+from proto.BluePrintManagement_pb2 import (
+    BluePrintDownloadInput,
+    BluePrintManagementOutput,
+    BluePrintRemoveInput,
+    BluePrintUploadInput,
+)
+from proto.BluePrintManagement_pb2_grpc import BluePrintManagementServiceServicer
+
+MDC_DATETIME_FORMAT = r"%Y-%m-%dT%H:%M:%S.%f%z"
+COMMON_HEADER_DATETIME_FORMAT = r"%Y-%m-%dT%H:%M:%S.%fZ"
+
+
+def fill_common_header(func):
+    """Decorator to fill handler's output values which is the same type for each handler.
+
+    It copies commonHeader from request object and set timestamp value.
+
+    :param func: Handler function
+    :return: _handler decorator callable object
+    """
+
+    @wraps(func)
+    def _decorator(
+        servicer: "ArtifactManagerServicer",
+        request: Union[BluePrintDownloadInput, BluePrintRemoveInput, BluePrintUploadInput],
+        context: ServicerContext,
+    ) -> BluePrintManagementOutput:
+
+        if not all([request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion]):
+            raise InvalidRequestError("Request has to have set both BluePrint name and version")
+        output: BluePrintManagementOutput = func(servicer, request, context)
+        # Set same values for every handler
+        output.commonHeader.CopyFrom(request.commonHeader)
+        output.commonHeader.timestamp = datetime.utcnow().strftime(COMMON_HEADER_DATETIME_FORMAT)
+        return output
+
+    return _decorator
+
+
+def translate_exception_to_response(func):
+    """Decorator that translates Artifact Manager exceptions into proper responses.
+
+    :param func: Handler function
+    :return: _handler decorator callable object
+    """
+
+    @wraps(func)
+    def _handler(
+        servicer: "ArtifactManagerServicer",
+        request: Union[BluePrintDownloadInput, BluePrintRemoveInput, BluePrintUploadInput],
+        context: ServicerContext,
+    ) -> BluePrintManagementOutput:
+        try:
+            output: BluePrintManagementOutput = func(servicer, request, context)
+            output.status.code = 200
+            output.status.message = "success"
+        except ArtifactManagerError as error:
+            # If ArtifactManagerError is raises one of defined error occurs.
+            # Every ArtifactManagerError based exception has status_code paramenter
+            # which has to be set in output. Use also exception's message to
+            # set errorMessage of the output.
+            output: BluePrintManagementOutput = BluePrintManagementOutput()
+            output.status.code = error.status_code
+            output.status.message = "failure"
+            output.status.errorMessage = str(error.message)
+
+            servicer.fill_MDC_timestamps()
+            servicer.logger.error(
+                "Error while processing the message - blueprintName={} blueprintVersion={}".format(
+                    request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+                ),
+                extra={"mdc": MDC.result()},
+            )
+            MDC.clear()
+        return output
+
+    return _handler
+
+
+def prepare_logging_context(func):
+    """Decorator that prepares MDC logging context for logs inside the handler.
+
+    :param func: Handler function
+    :return: _handler decorator callable object
+    """
+
+    @wraps(func)
+    def _decorator(
+        servicer: "ArtifactManagerServicer",
+        request: Union[BluePrintDownloadInput, BluePrintRemoveInput, BluePrintUploadInput],
+        context: ServicerContext,
+    ) -> BluePrintManagementOutput:
+        MDC.put("RequestID", request.commonHeader.requestId)
+        MDC.put("InvocationID", request.commonHeader.subRequestId)
+        MDC.put("ServiceName", servicer.__class__.__name__)
+        MDC.put("PartnerName", request.commonHeader.originatorId)
+        started_at = datetime.utcnow().replace(tzinfo=timezone.utc)
+        MDC.put("BeginTimestamp", started_at.strftime(MDC_DATETIME_FORMAT))
+
+        # Adding processing_started_at to the servicer so later we'll have the data to calculate elapsed time.
+        servicer.processing_started_at = started_at
+
+        MDC.put("TargetEntity", "py-executor")
+        MDC.put("TargetServiceName", func.__name__)
+        MDC.put("Server", socket.getfqdn())
+
+        output: BluePrintManagementOutput = func(servicer, request, context)
+        MDC.clear()
+        return output
+
+    return _decorator
+
+
+class ArtifactManagerServicer(BluePrintManagementServiceServicer):
+    """ArtifactManagerServer class.
+
+    Implements methods defined in proto files to manage artifacts repository.
+    These methods are: download, upload and remove.
+    """
+
+    processing_started_at = None
+
+    def __init__(self) -> NoReturn:
+        """Instance of ArtifactManagerServer class initialization.
+
+        Create logger for class using class name and set configuration property.
+        """
+        self.logger: Logger = get_logger(self.__class__.__name__)
+        self.repository: Repository = RepositoryStrategy.get_reporitory()
+
+    def fill_MDC_timestamps(self, status_code: int = 200) -> NoReturn:
+        """Add MDC context timestamps "in place".
+
+        :param status_code: int with expected response status. Default: 200 (success)
+        """
+        now = datetime.utcnow().replace(tzinfo=timezone.utc)
+        MDC.put("EndTimestamp", now.strftime(MDC_DATETIME_FORMAT))
+
+        # Elapsed time measured in miliseconds
+        MDC.put("ElapsedTime", (now - self.processing_started_at).total_seconds() * 1000)
+
+        MDC.put("StatusCode", status_code)
+
+    @prepare_logging_context
+    @translate_exception_to_response
+    @fill_common_header
+    def downloadBlueprint(self, request: BluePrintDownloadInput, context: ServicerContext) -> BluePrintManagementOutput:
+        """Download blueprint file request method.
+
+        Currently it only logs when is called and all base class method.
+        :param request: BluePrintDownloadInput
+        :param context: ServicerContext
+        :return: BluePrintManagementOutput
+        """
+        output: BluePrintManagementOutput = BluePrintManagementOutput()
+        output.fileChunk.chunk = self.repository.download_blueprint(
+            request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+        )
+        self.fill_MDC_timestamps()
+        self.logger.info(
+            "Blueprint download successfuly processed - blueprintName={} blueprintVersion={}".format(
+                request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+            ),
+            extra={"mdc": MDC.result()},
+        )
+        return output
+
+    @prepare_logging_context
+    @translate_exception_to_response
+    @fill_common_header
+    def uploadBlueprint(self, request: BluePrintUploadInput, context: ServicerContext) -> BluePrintManagementOutput:
+        """Upload blueprint file request method.
+
+        Currently it only logs when is called and all base class method.
+        :param request: BluePrintUploadInput
+        :param context: ServicerContext
+        :return: BluePrintManagementOutput
+        """
+        self.repository.upload_blueprint(
+            request.fileChunk.chunk, request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+        )
+        self.fill_MDC_timestamps()
+        self.logger.info(
+            "Blueprint upload successfuly processed - blueprintName={} blueprintVersion={}".format(
+                request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+            ),
+            extra={"mdc": MDC.result()},
+        )
+        return BluePrintManagementOutput()
+
+    @prepare_logging_context
+    @translate_exception_to_response
+    @fill_common_header
+    def removeBlueprint(self, request: BluePrintRemoveInput, context: ServicerContext) -> BluePrintManagementOutput:
+        """Remove blueprint file request method.
+
+        Currently it only logs when is called and all base class method.
+        :param request: BluePrintRemoveInput
+        :param context: ServicerContext
+        :return: BluePrintManagementOutput
+        """
+        self.repository.remove_blueprint(
+            request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+        )
+        self.fill_MDC_timestamps()
+        self.logger.info(
+            "Blueprint removal successfuly processed - blueprintName={} blueprintVersion={}".format(
+                request.actionIdentifiers.blueprintName, request.actionIdentifiers.blueprintVersion
+            ),
+            extra={"mdc": MDC.result()},
+        )
+        return BluePrintManagementOutput()
diff --git a/ms/artifact-manager/manager/utils.py b/ms/artifact-manager/manager/utils.py
new file mode 100644
index 0000000..da4cd9f
--- /dev/null
+++ b/ms/artifact-manager/manager/utils.py
@@ -0,0 +1,176 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+import os
+import shutil
+from abc import ABC, abstractmethod
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile, is_zipfile
+
+from manager.configuration import config
+from manager.errors import ArtifactNotFoundError, ArtifactOverwriteError, InvalidRequestError
+
+
+class Repository(ABC):
+    """Abstract repository class.
+
+    Defines repository methods.
+    """
+
+    @abstractmethod
+    def upload_blueprint(self, file: bytes, name: str, version: str) -> None:
+        """Store blueprint file in the repository.
+
+        :param file: File to save
+        :param name: Blueprint name
+        :param version: Blueprint version
+        """
+
+    @abstractmethod
+    def download_blueprint(self, name: str, version: str) -> bytes:
+        """Download blueprint file from repository.
+
+        :param name: Blueprint name
+        :param version: Blueprint version
+        :return: Zipped Blueprint file bytes
+        """
+
+    @abstractmethod
+    def remove_blueprint(self, name: str, version: str) -> None:
+        """Remove blueprint file from repository.
+
+        :param name: Blueprint name
+        :param version: Blueprint version
+        """
+
+
+class FileRepository(Repository):
+    """Store blueprints on local directory."""
+
+    base_path = None
+
+    def __init__(self, base_path: Path) -> None:
+        """Initialize the repository while passing the needed path.
+
+        :param base_path: Local OS path on which blueprint files reside.
+        """
+        self.base_path = base_path
+
+    def __remove_directory_tree(self, full_path: str) -> None:
+        """Remove specified path.
+
+        :param full_path: Full path to a directory.
+        :raises: FileNotFoundError
+        """
+        try:
+            shutil.rmtree(full_path, ignore_errors=False)
+        except OSError:
+            raise ArtifactNotFoundError
+
+    def __create_directory_tree(self, full_path: str, mode: int = 0o744, retry_on_error: bool = True) -> None:
+        """Create directory or overwrite existing one.
+
+        This method will handle a directory tree creation. If there is a collision
+        in directory structure - old directory tree will be removed
+        and creation will be attempted one more time. If the creation fails for the second time
+        the exception will be raised.
+
+        :param full_path: Full directory tree path (eg. one/two/tree) as string.
+        :param mode: Permission mask for the directories.
+        :param retry_on_error: Flag that indicates if there should be a attempt to retry the operation.
+        """
+        try:
+            os.makedirs(full_path, mode=mode)
+        except FileExistsError:
+            # In this case we know that cba of same name and version need to be overwritten
+            if retry_on_error:
+                self.__remove_directory_tree(full_path)
+                self.__create_directory_tree(full_path, mode=mode, retry_on_error=False)
+            else:
+                # This way we won't try for ever if something goes wrong
+                raise ArtifactOverwriteError
+
+    def upload_blueprint(self, cba_bytes: bytes, name: str, version: str) -> None:
+        """Store blueprint file in the repository.
+
+        :param cba_bytes: Bytes to save
+        :param name: Blueprint name
+        :param version: Blueprint version
+        """
+        temporary_file: BytesIO = BytesIO(cba_bytes)
+
+        if not is_zipfile(temporary_file):
+            raise InvalidRequestError
+
+        target_path: str = str(Path(self.base_path.absolute(), name, version))
+        self.__create_directory_tree(target_path)
+
+        with ZipFile(temporary_file, "r") as zip_file:  # type: ZipFile
+            zip_file.extractall(target_path)
+
+    def download_blueprint(self, name: str, version: str) -> bytes:
+        """Download blueprint file from repository.
+
+        This method does the in-memory zipping the files and returns bytes
+
+        :param name: Blueprint name
+        :param version: Blueprint version
+        :return: Zipped Blueprint file bytes
+        """
+        temporary_file: BytesIO = BytesIO()
+        files_path: str = str(Path(self.base_path.absolute(), name, version))
+        if not os.path.exists(files_path):
+            raise ArtifactNotFoundError
+
+        with ZipFile(temporary_file, "w") as zip_file:  # type: ZipFile
+            for directory_name, subdirectory_names, filenames in os.walk(files_path):  # type: str, list, list
+                for filename in filenames:  # type: str
+                    zip_file.write(Path(directory_name, filename))
+
+        # Rewind the fake file to allow reading
+        temporary_file.seek(0)
+
+        zip_as_bytes: bytes = temporary_file.read()
+        temporary_file.close()
+        return zip_as_bytes
+
+    def remove_blueprint(self, name: str, version: str) -> None:
+        """Remove blueprint file from repository.
+
+        :param name: Blueprint name
+        :param version: Blueprint version
+        :raises: FileNotFoundError
+        """
+        files_path: str = str(Path(self.base_path.absolute(), name, version))
+        self.__remove_directory_tree(files_path)
+
+
+class RepositoryStrategy(ABC):
+    """Strategy class.
+
+    It has only one public method `get_repository`, which returns valid repository
+    instance for the the configuration value.
+    You can create many Repository subclasses, but repository clients doesn't have
+    to know which one you use.
+    """
+
+    @classmethod
+    def get_reporitory(cls) -> Repository:
+        """Get the valid repository instance for the configuration value.
+
+        Currently it returns FileRepository because it is an only Repository implementation.
+        """
+        return FileRepository(Path(config["artifactManagerServer"]["fileRepositoryBasePath"]))
diff --git a/ms/artifact-manager/requirements/docker.txt b/ms/artifact-manager/requirements/docker.txt
new file mode 100644
index 0000000..67f68dd
--- /dev/null
+++ b/ms/artifact-manager/requirements/docker.txt
@@ -0,0 +1,2 @@
+-r shared.txt
+/opt/app/onap/dependencies/common
\ No newline at end of file
diff --git a/ms/artifact-manager/requirements/local.txt b/ms/artifact-manager/requirements/local.txt
new file mode 100644
index 0000000..6a06e16
--- /dev/null
+++ b/ms/artifact-manager/requirements/local.txt
@@ -0,0 +1,2 @@
+-r shared.txt
+../../py-modules/common
\ No newline at end of file
diff --git a/ms/artifact-manager/requirements/shared.txt b/ms/artifact-manager/requirements/shared.txt
new file mode 100644
index 0000000..971d4a8
--- /dev/null
+++ b/ms/artifact-manager/requirements/shared.txt
@@ -0,0 +1,3 @@
+grpcio-tools==1.25.0
+onappylog==1.0.9
+click==7.0
diff --git a/ms/py-executor/test-requirements.txt b/ms/artifact-manager/requirements/test.txt
similarity index 62%
copy from ms/py-executor/test-requirements.txt
copy to ms/artifact-manager/requirements/test.txt
index 79ed6ee..5304eac 100644
--- a/ms/py-executor/test-requirements.txt
+++ b/ms/artifact-manager/requirements/test.txt
@@ -1,3 +1,3 @@
 pytest==5.3.1
 pytest-grpc==0.7.0
--r requirements.txt
\ No newline at end of file
+-r local.txt
\ No newline at end of file
diff --git a/ms/artifact-manager/server.py b/ms/artifact-manager/server.py
new file mode 100644
index 0000000..fe70c88
--- /dev/null
+++ b/ms/artifact-manager/server.py
@@ -0,0 +1,47 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+from concurrent.futures import ThreadPoolExecutor
+
+import click
+from grpc import server as grpc_server
+from manager.configuration import config
+from manager.servicer import ArtifactManagerServicer
+from proto.BluePrintManagement_pb2_grpc import add_BluePrintManagementServiceServicer_to_server
+
+
+@click.command()
+def run_server():
+    """Run Artifact Manager gRPC server.
+
+    Values like 'maxWorkers' and 'port' must be specified in a config file in .ini format.
+
+    Config file path is specified by 'CONFIGURATION' environment variable.
+
+    """
+    max_workers: int = int(config["artifactManagerServer"]["maxWorkers"])
+    server: grpc_server = grpc_server(ThreadPoolExecutor(max_workers=max_workers))
+
+    add_BluePrintManagementServiceServicer_to_server(ArtifactManagerServicer(), server)
+    port_number: int = int(config["artifactManagerServer"]["port"])
+    server.add_insecure_port(f"[::]:{port_number}")
+
+    click.echo(f"Server starts on port {port_number} using {max_workers} workers.")
+    server.start()
+    server.wait_for_termination()
+
+
+if __name__ == "__main__":
+    run_server()
diff --git a/ms/artifact-manager/setup.py b/ms/artifact-manager/setup.py
new file mode 100644
index 0000000..b5b4487
--- /dev/null
+++ b/ms/artifact-manager/setup.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+from distutils.core import setup
+
+
+setup(
+    name="manager",
+    version="0.1",
+    description="CDS Artifact Manager",
+    packages=["manager"],
+)
diff --git a/ms/artifact-manager/tests/base_test.py b/ms/artifact-manager/tests/base_test.py
new file mode 100644
index 0000000..4466b33
--- /dev/null
+++ b/ms/artifact-manager/tests/base_test.py
@@ -0,0 +1,19 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+
+def test_mock_function():
+    """Basic mock test that allways work."""
+    assert True
diff --git a/ms/artifact-manager/tests/configuration-test.ini b/ms/artifact-manager/tests/configuration-test.ini
new file mode 100644
index 0000000..e28e6f1
--- /dev/null
+++ b/ms/artifact-manager/tests/configuration-test.ini
@@ -0,0 +1,4 @@
+[testSection]
+testValue: 123
+[artifactManagerServer]
+artifactManagerValue=123
diff --git a/ms/artifact-manager/tests/configuration_test.py b/ms/artifact-manager/tests/configuration_test.py
new file mode 100644
index 0000000..2199083
--- /dev/null
+++ b/ms/artifact-manager/tests/configuration_test.py
@@ -0,0 +1,47 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+from configparser import NoOptionError
+from pathlib import Path, PurePath
+from typing import NoReturn
+
+from pytest import raises
+
+from manager.configuration import ArtifactManagerConfiguration
+
+
+TEST_CONFIGURATION_FILE_PATH = str(
+    PurePath(Path(__file__).parent.absolute(), "configuration-test.ini")
+)
+
+
+def test_server_configuration_configuration_file_path() -> NoReturn:
+    """Test ArtifactManagerConfiguration class.
+
+    Test checks if configuration file is loaded properly and returns valid values.
+    If invalid section or option is provided it should raises KeyError or configparser.NoOptionError exceptions.
+    :return: NoReturn
+    """
+    configuration: ArtifactManagerConfiguration = ArtifactManagerConfiguration(
+        TEST_CONFIGURATION_FILE_PATH
+    )
+    assert configuration.get_section("testSection")
+    with raises(KeyError):
+        configuration.get_section("invalidSection")
+    assert configuration.get_property("testSection", "testValue") == "123"
+    with raises(NoOptionError):
+        configuration.get_property("testSection", "invalidValue")
+    assert configuration.artifact_manager_property("artifactManagerValue") == "123"
+    with raises(NoOptionError):
+        configuration.artifact_manager_property("invalidValue")
diff --git a/ms/artifact-manager/tests/servicer_test.py b/ms/artifact-manager/tests/servicer_test.py
new file mode 100644
index 0000000..131e6fb
--- /dev/null
+++ b/ms/artifact-manager/tests/servicer_test.py
@@ -0,0 +1,196 @@
+"""Copyright 2019 Deutsche Telekom.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+import os
+import shutil
+import zipfile
+from unittest.mock import patch
+
+import manager.utils
+from manager.servicer import ArtifactManagerServicer
+from proto.BluePrintCommon_pb2 import ActionIdentifiers, CommonHeader
+from proto.BluePrintManagement_pb2 import (
+    BluePrintDownloadInput,
+    BluePrintManagementOutput,
+    BluePrintRemoveInput,
+    BluePrintUploadInput,
+    FileChunk,
+)
+from proto.BluePrintManagement_pb2_grpc import (
+    BluePrintManagementServiceStub,
+    add_BluePrintManagementServiceServicer_to_server,
+)
+from pytest import fixture
+
+ZIP_FILE_BINARY = b"PK\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+
+
+class MockZipFile(zipfile.ZipFile):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def extractall(self, path: str) -> None:
+        pass
+
+    def write(self, *arg, **kwargs) -> None:
+        pass
+
+
+@fixture(scope="module")
+def grpc_add_to_server():
+    """pytest-grpcio required function."""
+    return add_BluePrintManagementServiceServicer_to_server
+
+
+@fixture(scope="module")
+def grpc_servicer():
+    """pytest-grpcio required function."""
+    return ArtifactManagerServicer()
+
+
+@fixture(scope="module")  # noqa
+def grpc_stub_cls(grpc_channel):
+    """pytest-grpcio required function."""
+    return BluePrintManagementServiceStub
+
+
+def test_servicer_upload_handler_header_failure(grpc_stub):
+    """Test servicer upload handler."""
+    request: BluePrintUploadInput = BluePrintUploadInput()
+    output: BluePrintManagementOutput = grpc_stub.uploadBlueprint(request)
+    assert output.status.code == 500
+    assert output.status.message == "failure"
+    assert output.status.errorMessage == "Request has to have set both BluePrint name and version"
+
+
+def test_servicer_download_handler_header_failure(grpc_stub):
+    """Test servicer download handler."""
+    request: BluePrintDownloadInput = BluePrintDownloadInput()
+    output: BluePrintManagementOutput = grpc_stub.downloadBlueprint(request)
+    assert output.status.code == 500
+    assert output.status.message == "failure"
+    assert output.status.errorMessage == "Request has to have set both BluePrint name and version"
+
+
+def test_servicer_remove_handler_header_failure(grpc_stub):
+    """Test servicer remove handler."""
+    request: BluePrintRemoveInput = BluePrintRemoveInput()
+    output: BluePrintManagementOutput = grpc_stub.removeBlueprint(request)
+    assert output.status.code == 500
+    assert output.status.message == "failure"
+    assert output.status.errorMessage == "Request has to have set both BluePrint name and version"
+
+
+def test_servicer_upload_handler_failure(grpc_stub):
+    """Test servicer upload handler."""
+    action_identifiers: ActionIdentifiers = ActionIdentifiers()
+    action_identifiers.blueprintName = "sample-cba"
+    action_identifiers.blueprintVersion = "1.0.0"
+    request: BluePrintUploadInput = BluePrintUploadInput(actionIdentifiers=action_identifiers)
+    output: BluePrintManagementOutput = grpc_stub.uploadBlueprint(request)
+    assert output.status.code == 500
+    assert output.status.message == "failure"
+    assert output.status.errorMessage == "Invalid request"
+
+
+def test_servicer_download_handler_failure(grpc_stub):
+    """Test servicer download handler."""
+    action_identifiers: ActionIdentifiers = ActionIdentifiers()
+    action_identifiers.blueprintName = "sample-cba"
+    action_identifiers.blueprintVersion = "2.0.0"
+    request: BluePrintDownloadInput = BluePrintDownloadInput(actionIdentifiers=action_identifiers)
+    output: BluePrintManagementOutput = grpc_stub.downloadBlueprint(request)
+    assert output.status.code == 500
+    assert output.status.message == "failure"
+    assert output.status.errorMessage == "Artifact not found"
+
+
+def test_servicer_remove_handler_failure(grpc_stub):
+    """Test servicer remove handler."""
+    action_identifiers: ActionIdentifiers = ActionIdentifiers()
+    action_identifiers.blueprintName = "sample-cba"
+    action_identifiers.blueprintVersion = "1.0.0"
+    request: BluePrintRemoveInput = BluePrintRemoveInput(actionIdentifiers=action_identifiers)
+    output: BluePrintManagementOutput = grpc_stub.removeBlueprint(request)
+    assert output.status.code == 500
+    assert output.status.message == "failure"
+    assert output.status.errorMessage == "Artifact not found"
+
+
+def test_servicer_upload_handler_success(grpc_stub):
+    """Test servicer upload handler."""
+    header: CommonHeader = CommonHeader()
+    header.requestId = "1234"
+    header.subRequestId = "1234-1"
+    header.originatorId = "CDS"
+
+    action_identifiers: ActionIdentifiers = ActionIdentifiers()
+    action_identifiers.blueprintName = "sample-cba"
+    action_identifiers.blueprintVersion = "1.0.0"
+    action_identifiers.actionName = "SampleScript"
+
+    file_chunk = FileChunk()
+    file_chunk.chunk = ZIP_FILE_BINARY
+
+    # fmt: off
+    with patch.object(os, "makedirs", return_value=None), \
+            patch.object(manager.utils, 'ZipFile', return_value=MockZipFile()):
+        request: BluePrintUploadInput = BluePrintUploadInput(
+            commonHeader=header, fileChunk=file_chunk, actionIdentifiers=action_identifiers
+        )
+        output: BluePrintManagementOutput = grpc_stub.uploadBlueprint(request)
+    # fmt: on
+    assert output.status.code == 200
+    assert output.status.message == "success"
+
+
+def test_servicer_download_handler_success(grpc_stub):
+    """Test servicer download handler."""
+    header: CommonHeader = CommonHeader()
+    header.requestId = "1234"
+    header.subRequestId = "1234-1"
+    header.originatorId = "CDS"
+
+    action_identifiers: ActionIdentifiers = ActionIdentifiers()
+    action_identifiers.blueprintName = "sample-cba"
+    action_identifiers.blueprintVersion = "1.0.0"
+    action_identifiers.actionName = "SampleScript"
+
+    with patch.object(os.path, "exists", return_value=True):
+        request: BluePrintDownloadInput = BluePrintDownloadInput(
+            commonHeader=header, actionIdentifiers=action_identifiers
+        )
+        output: BluePrintManagementOutput = grpc_stub.downloadBlueprint(request)
+    assert output.status.code == 200
+    assert output.status.message == "success"
+    assert output.fileChunk.chunk == ZIP_FILE_BINARY
+
+
+def test_servicer_remove_handler_success(grpc_stub):
+    """Test servicer remove handler."""
+    header: CommonHeader = CommonHeader()
+    header.requestId = "1234"
+    header.subRequestId = "1234-1"
+    header.originatorId = "CDS"
+
+    action_identifiers: ActionIdentifiers = ActionIdentifiers()
+    action_identifiers.blueprintName = "sample-cba"
+    action_identifiers.blueprintVersion = "1.0.0"
+    action_identifiers.actionName = "SampleScript"
+
+    with patch.object(shutil, "rmtree", return_value=None) as mock_rmtree:
+        request: BluePrintRemoveInput = BluePrintRemoveInput(commonHeader=header, actionIdentifiers=action_identifiers)
+        output: BluePrintManagementOutput = grpc_stub.removeBlueprint(request)
+    assert output.status.code == 200
+    assert output.status.message == "success"
diff --git a/ms/artifact-manager/tests/utils_test.py b/ms/artifact-manager/tests/utils_test.py
new file mode 100644
index 0000000..75d8b4c
--- /dev/null
+++ b/ms/artifact-manager/tests/utils_test.py
@@ -0,0 +1,59 @@
+import os
+import shutil
+import zipfile
+from unittest.mock import patch
+
+import manager.utils
+from manager.utils import FileRepository, Repository, RepositoryStrategy
+
+
+class MockZipFile(zipfile.ZipFile):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def extractall(self, path: str) -> None:
+        pass
+
+    def write(self, *arg, **kwargs) -> None:
+        pass
+
+
+def test_fetch_proper_repository():
+    repo: Repository = RepositoryStrategy.get_reporitory()
+    assert repo.__class__ is FileRepository
+
+
+def test_blueprint_upload():
+    repo: Repository = RepositoryStrategy.get_reporitory()
+    # fmt: off
+    with patch.object(manager.utils, "is_zipfile", return_value=True) as mock_is_zip, \
+            patch.object(os, "makedirs", return_value=None) as mock_mkdirs, \
+            patch.object(manager.utils, 'ZipFile', return_value=MockZipFile()
+        ):
+        repo.upload_blueprint(b"abcd", "test_cba", "1.0.a")
+        mock_is_zip.assert_called_once()
+        mock_mkdirs.assert_called_once_with('/tmp/test_cba/1.0.a', mode=0o744)
+    # fmt: on
+
+
+def test_blueprint_download():
+    repo: Repository = RepositoryStrategy.get_reporitory()
+    mock_path = [
+        ("test_cba", ["1.0.a"], []),
+        ("test_cba/1.0.a", [], ["file.txt"]),
+    ]
+    # fmt: off
+    with patch.object(os, "walk", return_value=mock_path) as mock_walk, \
+            patch.object(manager.utils, 'ZipFile', return_value=MockZipFile()), \
+            patch.object(os.path, 'exists', return_value=True
+        ):
+        repo.download_blueprint("test_cba", "1.0.a")
+        mock_walk.assert_called_once_with('/tmp/test_cba/1.0.a')
+    # fmt: on
+
+
+def test_remove_blueprint():
+    repo: Repository = RepositoryStrategy.get_reporitory()
+    with patch.object(shutil, "rmtree", return_value=None) as mock_rmtree:
+        repo.remove_blueprint("cba", "1.0a")
+        mock_rmtree.assert_called_once()
diff --git a/ms/artifact-manager/tox.ini b/ms/artifact-manager/tox.ini
new file mode 100644
index 0000000..a952678
--- /dev/null
+++ b/ms/artifact-manager/tox.ini
@@ -0,0 +1,27 @@
+[tox]
+envlist=py37,py38
+skipsdist=True
+[testenv]
+setenv =
+    PYTHONPATH = {toxinidir}
+    CONFIGURATION = {toxinidir}/../configuration-local.ini
+deps =
+    -rrequirements/test.txt
+commands = pytest
+[testenv:codelint]
+deps =
+    black
+commands = black -l 120 --check {posargs:.}
+[testenv:doclint]
+deps =
+    flake8-docstrings
+commands = flake8 --doctest --docstring-convention google --max-line-length 120 --exclude .svn,CVS,.bzr,.hg,.git,__pycache__,.tox,.eggs,*.egg,*test.py --select=D {posargs:.}
+[testenv:coverage]
+basepython = python3.7
+setenv = 
+    PYTHONPATH = {toxinidir}
+    CONFIGURATION = {toxinidir}/../configuration-local.ini
+deps =
+    -rrequirements/test.txt
+    pytest-cov
+commands = pytest --cov=manager --cov-fail-under=60 --cov-config={toxinidir}/.coveragerc .
diff --git a/ms/py-executor/configuration-local.ini b/ms/configuration-local.ini
similarity index 72%
rename from ms/py-executor/configuration-local.ini
rename to ms/configuration-local.ini
index c98746a..431ef4c 100644
--- a/ms/py-executor/configuration-local.ini
+++ b/ms/configuration-local.ini
@@ -11,3 +11,11 @@
 blueprintDeployPath=test/resources
 blueprintArchivePath=target/blueprints/archive
 blueprintWorkingPath=target/blueprints/work
+
+[artifactManagerServer]
+port=50052
+logFile=server.log
+maxWorkers=20
+debug=true
+logConfig=logging.yaml
+fileRepositoryBasePath=/tmp/
\ No newline at end of file
diff --git a/ms/py-executor/configuration.ini b/ms/configuration.ini
similarity index 73%
rename from ms/py-executor/configuration.ini
rename to ms/configuration.ini
index 612c628..a5c16c7 100644
--- a/ms/py-executor/configuration.ini
+++ b/ms/configuration.ini
@@ -14,3 +14,11 @@
 blueprintDeployPath=/opt/app/onap/blueprints/deploy
 blueprintArchivePath=/opt/app/onap/blueprints/archive
 blueprintWorkingPath=/opt/app/onap/blueprints/work
+
+[artifactManagerServer]
+port=%(ARTIFACT_MANAGER_PORT)s
+logFile=%(ARTIFACT_MANAGER_SERVER_LOG_FILE)s
+maxWorkers=20
+debug=false
+logConfig=logging.yaml
+fileRepositoryBasePath=/tmp/
\ No newline at end of file
diff --git a/ms/logging.yaml b/ms/logging.yaml
new file mode 100644
index 0000000..3a31ca8
--- /dev/null
+++ b/ms/logging.yaml
@@ -0,0 +1,14 @@
+version: 1
+
+disable_existing_loggers: True
+
+formatters:
+    mdcFormatter:
+        format: "%(asctime)s:[%(name)s] %(created)f %(module)s %(funcName)s %(pathname)s %(process)d %(levelno)s :[ %(threadName)s  %(thread)d]: [%(mdc)s]: [%(filename)s]-[%(lineno)d] [%(levelname)s]:%(message)s"
+        mdcfmt: "{key1} {key2} {key3} {key4} dwdawdwa "
+        datefmt: "%Y-%m-%d %H:%M:%S"
+        (): onaplogging.mdcformatter.MDCFormatter
+    standard:
+        format: '%(asctime)s:[%(name)s]:[%(filename)s]-[%(lineno)d]
+            [%(levelname)s]:%(message)s  '
+        datefmt: "%Y-%m-%d %H:%M:%S"
\ No newline at end of file
diff --git a/ms/py-executor/blueprints_grpc/__init__.py b/ms/py-executor/blueprints_grpc/__init__.py
index 726849f..8a2db9e 100644
--- a/ms/py-executor/blueprints_grpc/__init__.py
+++ b/ms/py-executor/blueprints_grpc/__init__.py
@@ -12,8 +12,8 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-from .proto.BluePrintCommon_pb2 import *
-from .proto.BluePrintProcessing_pb2 import *
+from proto.BluePrintCommon_pb2 import *
+from proto.BluePrintProcessing_pb2 import *
 from .script_executor_configuration import *
 from .executor_utils import *
 from .blueprint_processing_server import *
\ No newline at end of file
diff --git a/ms/py-executor/blueprints_grpc/blueprint_processing_server.py b/ms/py-executor/blueprints_grpc/blueprint_processing_server.py
index f1f29a0..322d34b 100644
--- a/ms/py-executor/blueprints_grpc/blueprint_processing_server.py
+++ b/ms/py-executor/blueprints_grpc/blueprint_processing_server.py
@@ -16,7 +16,7 @@
 
 import logging
 from google.protobuf.json_format import MessageToJson
-from .proto import BluePrintProcessing_pb2_grpc as BluePrintProcessing_pb2_grpc
+from proto import BluePrintProcessing_pb2_grpc as BluePrintProcessing_pb2_grpc
 from .script_executor_configuration import ScriptExecutorConfiguration
 from .executor_utils import instance_for_input
 
diff --git a/ms/py-executor/blueprints_grpc/executor_utils.py b/ms/py-executor/blueprints_grpc/executor_utils.py
index 44b6d8e..701958f 100644
--- a/ms/py-executor/blueprints_grpc/executor_utils.py
+++ b/ms/py-executor/blueprints_grpc/executor_utils.py
@@ -14,14 +14,28 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-from google.protobuf.timestamp_pb2 import Timestamp
-from google.protobuf import struct_pb2
-from google.protobuf import json_format
-import sys, importlib, importlib.util, json, time, datetime
+import datetime
+import importlib
+import importlib.util
+import json
 import logging
-from .proto.BluePrintProcessing_pb2 import ExecutionServiceInput, ExecutionServiceOutput
-from .proto.BluePrintCommon_pb2 import Status, EVENT_COMPONENT_TRACE, EVENT_COMPONENT_PROCESSING, \
-    EVENT_COMPONENT_EXECUTED, EVENT_COMPONENT_NOTIFICATION
+import sys
+import time
+
+from google.protobuf import json_format, struct_pb2
+from google.protobuf.timestamp_pb2 import Timestamp
+from proto.BluePrintCommon_pb2 import (
+    EVENT_COMPONENT_EXECUTED,
+    EVENT_COMPONENT_NOTIFICATION,
+    EVENT_COMPONENT_PROCESSING,
+    EVENT_COMPONENT_TRACE,
+    Status
+)
+from proto.BluePrintProcessing_pb2 import (
+    ExecutionServiceInput,
+    ExecutionServiceOutput,
+)
+
 from .script_executor_configuration import ScriptExecutorConfiguration
 
 logger = logging.getLogger("Utils")
diff --git a/ms/py-executor/blueprints_grpc/proto/BluePrintCommon_pb2.py b/ms/py-executor/blueprints_grpc/proto/BluePrintCommon_pb2.py
deleted file mode 100644
index db78b2b..0000000
--- a/ms/py-executor/blueprints_grpc/proto/BluePrintCommon_pb2.py
+++ /dev/null
@@ -1,331 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: BluePrintCommon.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
-from google.protobuf.internal import enum_type_wrapper
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='BluePrintCommon.proto',
-  package='org.onap.ccsdk.cds.controllerblueprints.common.api',
-  syntax='proto3',
-  serialized_options=_b('P\001'),
-  serialized_pb=_b('\n\x15\x42luePrintCommon.proto\x12\x32org.onap.ccsdk.cds.controllerblueprints.common.api\"\xa8\x01\n\x0c\x43ommonHeader\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\x14\n\x0coriginatorId\x18\x17 \x01(\t\x12\x11\n\trequestId\x18\x03 \x01(\t\x12\x14\n\x0csubRequestId\x18\x04 \x01(\t\x12\x46\n\x04\x66lag\x18\x05 \x01(\x0b\x32\x38.org.onap.ccsdk.cds.controllerblueprints.common.api.Flag\"$\n\x04\x46lag\x12\x0f\n\x07isForce\x18\x01 \x01(\x08\x12\x0b\n\x03ttl\x18\x02 \x01(\x05\"f\n\x11\x41\x63tionIdentifiers\x12\x15\n\rblueprintName\x18\x01 \x01(\t\x12\x18\n\x10\x62lueprintVersion\x18\x02 \x01(\t\x12\x12\n\nactionName\x18\x03 \x01(\t\x12\x0c\n\x04mode\x18\x04 \x01(\t\"\xa2\x01\n\x06Status\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x14\n\x0c\x65rrorMessage\x18\x02 \x01(\t\x12\x0f\n\x07message\x18\x03 \x01(\t\x12P\n\teventType\x18\x04 \x01(\x0e\x32=.org.onap.ccsdk.cds.controllerblueprints.common.api.EventType\x12\x11\n\ttimestamp\x18\x05 \x01(\t*\xa3\x01\n\tEventType\x12\x1b\n\x17\x45VENT_COMPONENT_FAILURE\x10\x00\x12\x1e\n\x1a\x45VENT_COMPONENT_PROCESSING\x10\x01\x12 \n\x1c\x45VENT_COMPONENT_NOTIFICATION\x10\x02\x12\x1c\n\x18\x45VENT_COMPONENT_EXECUTED\x10\x03\x12\x19\n\x15\x45VENT_COMPONENT_TRACE\x10\x04\x42\x02P\x01\x62\x06proto3')
-)
-
-_EVENTTYPE = _descriptor.EnumDescriptor(
-  name='EventType',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.EventType',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='EVENT_COMPONENT_FAILURE', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='EVENT_COMPONENT_PROCESSING', index=1, number=1,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='EVENT_COMPONENT_NOTIFICATION', index=2, number=2,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='EVENT_COMPONENT_EXECUTED', index=3, number=3,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='EVENT_COMPONENT_TRACE', index=4, number=4,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=556,
-  serialized_end=719,
-)
-_sym_db.RegisterEnumDescriptor(_EVENTTYPE)
-
-EventType = enum_type_wrapper.EnumTypeWrapper(_EVENTTYPE)
-EVENT_COMPONENT_FAILURE = 0
-EVENT_COMPONENT_PROCESSING = 1
-EVENT_COMPONENT_NOTIFICATION = 2
-EVENT_COMPONENT_EXECUTED = 3
-EVENT_COMPONENT_TRACE = 4
-
-
-
-_COMMONHEADER = _descriptor.Descriptor(
-  name='CommonHeader',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='timestamp', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader.timestamp', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='originatorId', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader.originatorId', index=1,
-      number=23, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='requestId', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader.requestId', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='subRequestId', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader.subRequestId', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader.flag', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=78,
-  serialized_end=246,
-)
-
-
-_FLAG = _descriptor.Descriptor(
-  name='Flag',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Flag',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='isForce', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Flag.isForce', index=0,
-      number=1, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='ttl', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Flag.ttl', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=248,
-  serialized_end=284,
-)
-
-
-_ACTIONIDENTIFIERS = _descriptor.Descriptor(
-  name='ActionIdentifiers',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='blueprintName', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers.blueprintName', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='blueprintVersion', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers.blueprintVersion', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='actionName', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers.actionName', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='mode', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers.mode', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=286,
-  serialized_end=388,
-)
-
-
-_STATUS = _descriptor.Descriptor(
-  name='Status',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Status',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='code', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Status.code', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='errorMessage', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Status.errorMessage', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='message', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Status.message', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='eventType', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Status.eventType', index=3,
-      number=4, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='timestamp', full_name='org.onap.ccsdk.cds.controllerblueprints.common.api.Status.timestamp', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=391,
-  serialized_end=553,
-)
-
-_COMMONHEADER.fields_by_name['flag'].message_type = _FLAG
-_STATUS.fields_by_name['eventType'].enum_type = _EVENTTYPE
-DESCRIPTOR.message_types_by_name['CommonHeader'] = _COMMONHEADER
-DESCRIPTOR.message_types_by_name['Flag'] = _FLAG
-DESCRIPTOR.message_types_by_name['ActionIdentifiers'] = _ACTIONIDENTIFIERS
-DESCRIPTOR.message_types_by_name['Status'] = _STATUS
-DESCRIPTOR.enum_types_by_name['EventType'] = _EVENTTYPE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-CommonHeader = _reflection.GeneratedProtocolMessageType('CommonHeader', (_message.Message,), {
-  'DESCRIPTOR' : _COMMONHEADER,
-  '__module__' : 'BluePrintCommon_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader)
-  })
-_sym_db.RegisterMessage(CommonHeader)
-
-Flag = _reflection.GeneratedProtocolMessageType('Flag', (_message.Message,), {
-  'DESCRIPTOR' : _FLAG,
-  '__module__' : 'BluePrintCommon_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.common.api.Flag)
-  })
-_sym_db.RegisterMessage(Flag)
-
-ActionIdentifiers = _reflection.GeneratedProtocolMessageType('ActionIdentifiers', (_message.Message,), {
-  'DESCRIPTOR' : _ACTIONIDENTIFIERS,
-  '__module__' : 'BluePrintCommon_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers)
-  })
-_sym_db.RegisterMessage(ActionIdentifiers)
-
-Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
-  'DESCRIPTOR' : _STATUS,
-  '__module__' : 'BluePrintCommon_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.common.api.Status)
-  })
-_sym_db.RegisterMessage(Status)
-
-
-DESCRIPTOR._options = None
-# @@protoc_insertion_point(module_scope)
diff --git a/ms/py-executor/blueprints_grpc/proto/BluePrintCommon_pb2_grpc.py b/ms/py-executor/blueprints_grpc/proto/BluePrintCommon_pb2_grpc.py
deleted file mode 100644
index 0129ff9..0000000
--- a/ms/py-executor/blueprints_grpc/proto/BluePrintCommon_pb2_grpc.py
+++ /dev/null
@@ -1,17 +0,0 @@
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
diff --git a/ms/py-executor/blueprints_grpc/proto/BluePrintManagement_pb2.py b/ms/py-executor/blueprints_grpc/proto/BluePrintManagement_pb2.py
deleted file mode 100644
index a2e0ec2..0000000
--- a/ms/py-executor/blueprints_grpc/proto/BluePrintManagement_pb2.py
+++ /dev/null
@@ -1,528 +0,0 @@
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: BluePrintManagement.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
-from google.protobuf.internal import enum_type_wrapper
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
-from blueprints_grpc.proto import BluePrintCommon_pb2 as BluePrintCommon__pb2
-
-
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='BluePrintManagement.proto',
-  package='org.onap.ccsdk.cds.controllerblueprints.management.api',
-  syntax='proto3',
-  serialized_options=_b('P\001'),
-  serialized_pb=_b('\n\x19\x42luePrintManagement.proto\x12\x36org.onap.ccsdk.cds.controllerblueprints.management.api\x1a\x1cgoogle/protobuf/struct.proto\x1a\x15\x42luePrintCommon.proto\"\xd3\x02\n\x14\x42luePrintUploadInput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12T\n\tfileChunk\x18\x02 \x01(\x0b\x32\x41.org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk\x12`\n\x11\x61\x63tionIdentifiers\x18\x03 \x01(\x0b\x32\x45.org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers\x12+\n\nproperties\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xff\x01\n\x16\x42luePrintDownloadInput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12`\n\x11\x61\x63tionIdentifiers\x18\x02 \x01(\x0b\x32\x45.org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers\x12+\n\nproperties\x18\x03 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xfd\x01\n\x14\x42luePrintRemoveInput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12`\n\x11\x61\x63tionIdentifiers\x18\x02 \x01(\x0b\x32\x45.org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers\x12+\n\nproperties\x18\x03 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xb9\x01\n\x17\x42luePrintBootstrapInput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12\x0f\n\x07loadCBA\x18\x02 \x01(\x08\x12\x15\n\rloadModelType\x18\x03 \x01(\x08\x12\x1e\n\x16loadResourceDictionary\x18\x04 \x01(\x08\"\xc2\x02\n\x19\x42luePrintManagementOutput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12T\n\tfileChunk\x18\x02 \x01(\x0b\x32\x41.org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk\x12J\n\x06status\x18\x03 \x01(\x0b\x32:.org.onap.ccsdk.cds.controllerblueprints.common.api.Status\x12+\n\nproperties\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct\"\x1a\n\tFileChunk\x12\r\n\x05\x63hunk\x18\x01 \x01(\x0c*4\n\x0e\x44ownloadAction\x12\n\n\x06SEARCH\x10\x00\x12\x0b\n\x07STARTER\x10\x01\x12\t\n\x05\x43LONE\x10\x02*@\n\x0cUploadAction\x12\t\n\x05\x44RAFT\x10\x00\x12\n\n\x06\x45NRICH\x10\x01\x12\x0c\n\x08VALIDATE\x10\x02\x12\x0b\n\x07PUBLISH\x10\x03*\x1b\n\x0cRemoveAction\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x32\xfa\x05\n\x1a\x42luePrintManagementService\x12\xb6\x01\n\x11\x64ownloadBlueprint\x12N.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintDownloadInput\x1aQ.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput\x12\xb2\x01\n\x0fuploadBlueprint\x12L.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput\x1aQ.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput\x12\xb2\x01\n\x0fremoveBlueprint\x12L.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintRemoveInput\x1aQ.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput\x12\xb8\x01\n\x12\x62ootstrapBlueprint\x12O.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput\x1aQ.org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutputB\x02P\x01\x62\x06proto3')
-  ,
-  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,BluePrintCommon__pb2.DESCRIPTOR,])
-
-_DOWNLOADACTION = _descriptor.EnumDescriptor(
-  name='DownloadAction',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.DownloadAction',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='SEARCH', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='STARTER', index=1, number=1,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='CLONE', index=2, number=2,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=1535,
-  serialized_end=1587,
-)
-_sym_db.RegisterEnumDescriptor(_DOWNLOADACTION)
-
-DownloadAction = enum_type_wrapper.EnumTypeWrapper(_DOWNLOADACTION)
-_UPLOADACTION = _descriptor.EnumDescriptor(
-  name='UploadAction',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.UploadAction',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='DRAFT', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='ENRICH', index=1, number=1,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='VALIDATE', index=2, number=2,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='PUBLISH', index=3, number=3,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=1589,
-  serialized_end=1653,
-)
-_sym_db.RegisterEnumDescriptor(_UPLOADACTION)
-
-UploadAction = enum_type_wrapper.EnumTypeWrapper(_UPLOADACTION)
-_REMOVEACTION = _descriptor.EnumDescriptor(
-  name='RemoveAction',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.RemoveAction',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='DEFAULT', index=0, number=0,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=1655,
-  serialized_end=1682,
-)
-_sym_db.RegisterEnumDescriptor(_REMOVEACTION)
-
-RemoveAction = enum_type_wrapper.EnumTypeWrapper(_REMOVEACTION)
-SEARCH = 0
-STARTER = 1
-CLONE = 2
-DRAFT = 0
-ENRICH = 1
-VALIDATE = 2
-PUBLISH = 3
-DEFAULT = 0
-
-
-
-_BLUEPRINTUPLOADINPUT = _descriptor.Descriptor(
-  name='BluePrintUploadInput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='fileChunk', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput.fileChunk', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='actionIdentifiers', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput.actionIdentifiers', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='properties', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput.properties', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=139,
-  serialized_end=478,
-)
-
-
-_BLUEPRINTDOWNLOADINPUT = _descriptor.Descriptor(
-  name='BluePrintDownloadInput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintDownloadInput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintDownloadInput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='actionIdentifiers', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintDownloadInput.actionIdentifiers', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='properties', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintDownloadInput.properties', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=481,
-  serialized_end=736,
-)
-
-
-_BLUEPRINTREMOVEINPUT = _descriptor.Descriptor(
-  name='BluePrintRemoveInput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintRemoveInput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintRemoveInput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='actionIdentifiers', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintRemoveInput.actionIdentifiers', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='properties', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintRemoveInput.properties', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=739,
-  serialized_end=992,
-)
-
-
-_BLUEPRINTBOOTSTRAPINPUT = _descriptor.Descriptor(
-  name='BluePrintBootstrapInput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='loadCBA', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput.loadCBA', index=1,
-      number=2, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='loadModelType', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput.loadModelType', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='loadResourceDictionary', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput.loadResourceDictionary', index=3,
-      number=4, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=995,
-  serialized_end=1180,
-)
-
-
-_BLUEPRINTMANAGEMENTOUTPUT = _descriptor.Descriptor(
-  name='BluePrintManagementOutput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='fileChunk', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput.fileChunk', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput.status', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='properties', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput.properties', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1183,
-  serialized_end=1505,
-)
-
-
-_FILECHUNK = _descriptor.Descriptor(
-  name='FileChunk',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='chunk', full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk.chunk', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b(""),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1507,
-  serialized_end=1533,
-)
-
-_BLUEPRINTUPLOADINPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_BLUEPRINTUPLOADINPUT.fields_by_name['fileChunk'].message_type = _FILECHUNK
-_BLUEPRINTUPLOADINPUT.fields_by_name['actionIdentifiers'].message_type = BluePrintCommon__pb2._ACTIONIDENTIFIERS
-_BLUEPRINTUPLOADINPUT.fields_by_name['properties'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-_BLUEPRINTDOWNLOADINPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_BLUEPRINTDOWNLOADINPUT.fields_by_name['actionIdentifiers'].message_type = BluePrintCommon__pb2._ACTIONIDENTIFIERS
-_BLUEPRINTDOWNLOADINPUT.fields_by_name['properties'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-_BLUEPRINTREMOVEINPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_BLUEPRINTREMOVEINPUT.fields_by_name['actionIdentifiers'].message_type = BluePrintCommon__pb2._ACTIONIDENTIFIERS
-_BLUEPRINTREMOVEINPUT.fields_by_name['properties'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-_BLUEPRINTBOOTSTRAPINPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_BLUEPRINTMANAGEMENTOUTPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_BLUEPRINTMANAGEMENTOUTPUT.fields_by_name['fileChunk'].message_type = _FILECHUNK
-_BLUEPRINTMANAGEMENTOUTPUT.fields_by_name['status'].message_type = BluePrintCommon__pb2._STATUS
-_BLUEPRINTMANAGEMENTOUTPUT.fields_by_name['properties'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-DESCRIPTOR.message_types_by_name['BluePrintUploadInput'] = _BLUEPRINTUPLOADINPUT
-DESCRIPTOR.message_types_by_name['BluePrintDownloadInput'] = _BLUEPRINTDOWNLOADINPUT
-DESCRIPTOR.message_types_by_name['BluePrintRemoveInput'] = _BLUEPRINTREMOVEINPUT
-DESCRIPTOR.message_types_by_name['BluePrintBootstrapInput'] = _BLUEPRINTBOOTSTRAPINPUT
-DESCRIPTOR.message_types_by_name['BluePrintManagementOutput'] = _BLUEPRINTMANAGEMENTOUTPUT
-DESCRIPTOR.message_types_by_name['FileChunk'] = _FILECHUNK
-DESCRIPTOR.enum_types_by_name['DownloadAction'] = _DOWNLOADACTION
-DESCRIPTOR.enum_types_by_name['UploadAction'] = _UPLOADACTION
-DESCRIPTOR.enum_types_by_name['RemoveAction'] = _REMOVEACTION
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-BluePrintUploadInput = _reflection.GeneratedProtocolMessageType('BluePrintUploadInput', (_message.Message,), {
-  'DESCRIPTOR' : _BLUEPRINTUPLOADINPUT,
-  '__module__' : 'BluePrintManagement_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintUploadInput)
-  })
-_sym_db.RegisterMessage(BluePrintUploadInput)
-
-BluePrintDownloadInput = _reflection.GeneratedProtocolMessageType('BluePrintDownloadInput', (_message.Message,), {
-  'DESCRIPTOR' : _BLUEPRINTDOWNLOADINPUT,
-  '__module__' : 'BluePrintManagement_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintDownloadInput)
-  })
-_sym_db.RegisterMessage(BluePrintDownloadInput)
-
-BluePrintRemoveInput = _reflection.GeneratedProtocolMessageType('BluePrintRemoveInput', (_message.Message,), {
-  'DESCRIPTOR' : _BLUEPRINTREMOVEINPUT,
-  '__module__' : 'BluePrintManagement_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintRemoveInput)
-  })
-_sym_db.RegisterMessage(BluePrintRemoveInput)
-
-BluePrintBootstrapInput = _reflection.GeneratedProtocolMessageType('BluePrintBootstrapInput', (_message.Message,), {
-  'DESCRIPTOR' : _BLUEPRINTBOOTSTRAPINPUT,
-  '__module__' : 'BluePrintManagement_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintBootstrapInput)
-  })
-_sym_db.RegisterMessage(BluePrintBootstrapInput)
-
-BluePrintManagementOutput = _reflection.GeneratedProtocolMessageType('BluePrintManagementOutput', (_message.Message,), {
-  'DESCRIPTOR' : _BLUEPRINTMANAGEMENTOUTPUT,
-  '__module__' : 'BluePrintManagement_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementOutput)
-  })
-_sym_db.RegisterMessage(BluePrintManagementOutput)
-
-FileChunk = _reflection.GeneratedProtocolMessageType('FileChunk', (_message.Message,), {
-  'DESCRIPTOR' : _FILECHUNK,
-  '__module__' : 'BluePrintManagement_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.management.api.FileChunk)
-  })
-_sym_db.RegisterMessage(FileChunk)
-
-
-DESCRIPTOR._options = None
-
-_BLUEPRINTMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
-  name='BluePrintManagementService',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  serialized_start=1685,
-  serialized_end=2447,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='downloadBlueprint',
-    full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService.downloadBlueprint',
-    index=0,
-    containing_service=None,
-    input_type=_BLUEPRINTDOWNLOADINPUT,
-    output_type=_BLUEPRINTMANAGEMENTOUTPUT,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='uploadBlueprint',
-    full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService.uploadBlueprint',
-    index=1,
-    containing_service=None,
-    input_type=_BLUEPRINTUPLOADINPUT,
-    output_type=_BLUEPRINTMANAGEMENTOUTPUT,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='removeBlueprint',
-    full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService.removeBlueprint',
-    index=2,
-    containing_service=None,
-    input_type=_BLUEPRINTREMOVEINPUT,
-    output_type=_BLUEPRINTMANAGEMENTOUTPUT,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='bootstrapBlueprint',
-    full_name='org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService.bootstrapBlueprint',
-    index=3,
-    containing_service=None,
-    input_type=_BLUEPRINTBOOTSTRAPINPUT,
-    output_type=_BLUEPRINTMANAGEMENTOUTPUT,
-    serialized_options=None,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_BLUEPRINTMANAGEMENTSERVICE)
-
-DESCRIPTOR.services_by_name['BluePrintManagementService'] = _BLUEPRINTMANAGEMENTSERVICE
-
-# @@protoc_insertion_point(module_scope)
diff --git a/ms/py-executor/blueprints_grpc/proto/BluePrintManagement_pb2_grpc.py b/ms/py-executor/blueprints_grpc/proto/BluePrintManagement_pb2_grpc.py
deleted file mode 100644
index 423a460..0000000
--- a/ms/py-executor/blueprints_grpc/proto/BluePrintManagement_pb2_grpc.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from blueprints_grpc.proto import BluePrintManagement_pb2 as BluePrintManagement__pb2
-
-
-class BluePrintManagementServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.downloadBlueprint = channel.unary_unary(
-        '/org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService/downloadBlueprint',
-        request_serializer=BluePrintManagement__pb2.BluePrintDownloadInput.SerializeToString,
-        response_deserializer=BluePrintManagement__pb2.BluePrintManagementOutput.FromString,
-        )
-    self.uploadBlueprint = channel.unary_unary(
-        '/org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService/uploadBlueprint',
-        request_serializer=BluePrintManagement__pb2.BluePrintUploadInput.SerializeToString,
-        response_deserializer=BluePrintManagement__pb2.BluePrintManagementOutput.FromString,
-        )
-    self.removeBlueprint = channel.unary_unary(
-        '/org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService/removeBlueprint',
-        request_serializer=BluePrintManagement__pb2.BluePrintRemoveInput.SerializeToString,
-        response_deserializer=BluePrintManagement__pb2.BluePrintManagementOutput.FromString,
-        )
-    self.bootstrapBlueprint = channel.unary_unary(
-        '/org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService/bootstrapBlueprint',
-        request_serializer=BluePrintManagement__pb2.BluePrintBootstrapInput.SerializeToString,
-        response_deserializer=BluePrintManagement__pb2.BluePrintManagementOutput.FromString,
-        )
-
-
-class BluePrintManagementServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def downloadBlueprint(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def uploadBlueprint(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def removeBlueprint(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def bootstrapBlueprint(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_BluePrintManagementServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'downloadBlueprint': grpc.unary_unary_rpc_method_handler(
-          servicer.downloadBlueprint,
-          request_deserializer=BluePrintManagement__pb2.BluePrintDownloadInput.FromString,
-          response_serializer=BluePrintManagement__pb2.BluePrintManagementOutput.SerializeToString,
-      ),
-      'uploadBlueprint': grpc.unary_unary_rpc_method_handler(
-          servicer.uploadBlueprint,
-          request_deserializer=BluePrintManagement__pb2.BluePrintUploadInput.FromString,
-          response_serializer=BluePrintManagement__pb2.BluePrintManagementOutput.SerializeToString,
-      ),
-      'removeBlueprint': grpc.unary_unary_rpc_method_handler(
-          servicer.removeBlueprint,
-          request_deserializer=BluePrintManagement__pb2.BluePrintRemoveInput.FromString,
-          response_serializer=BluePrintManagement__pb2.BluePrintManagementOutput.SerializeToString,
-      ),
-      'bootstrapBlueprint': grpc.unary_unary_rpc_method_handler(
-          servicer.bootstrapBlueprint,
-          request_deserializer=BluePrintManagement__pb2.BluePrintBootstrapInput.FromString,
-          response_serializer=BluePrintManagement__pb2.BluePrintManagementOutput.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.onap.ccsdk.cds.controllerblueprints.management.api.BluePrintManagementService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/ms/py-executor/blueprints_grpc/proto/BluePrintProcessing_pb2.py b/ms/py-executor/blueprints_grpc/proto/BluePrintProcessing_pb2.py
deleted file mode 100644
index 36f8c41..0000000
--- a/ms/py-executor/blueprints_grpc/proto/BluePrintProcessing_pb2.py
+++ /dev/null
@@ -1,193 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: BluePrintProcessing.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
-from blueprints_grpc.proto import BluePrintCommon_pb2 as BluePrintCommon__pb2
-
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='BluePrintProcessing.proto',
-  package='org.onap.ccsdk.cds.controllerblueprints.processing.api',
-  syntax='proto3',
-  serialized_options=_b('P\001'),
-  serialized_pb=_b('\n\x19\x42luePrintProcessing.proto\x12\x36org.onap.ccsdk.cds.controllerblueprints.processing.api\x1a\x1cgoogle/protobuf/struct.proto\x1a\x15\x42luePrintCommon.proto\"\xfb\x01\n\x15\x45xecutionServiceInput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12`\n\x11\x61\x63tionIdentifiers\x18\x02 \x01(\x0b\x32\x45.org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers\x12(\n\x07payload\x18\x03 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xc8\x02\n\x16\x45xecutionServiceOutput\x12V\n\x0c\x63ommonHeader\x18\x01 \x01(\x0b\x32@.org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader\x12`\n\x11\x61\x63tionIdentifiers\x18\x02 \x01(\x0b\x32\x45.org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers\x12J\n\x06status\x18\x03 \x01(\x0b\x32:.org.onap.ccsdk.cds.controllerblueprints.common.api.Status\x12(\n\x07payload\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct2\xcb\x01\n\x1a\x42luePrintProcessingService\x12\xac\x01\n\x07process\x12M.org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput\x1aN.org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput(\x01\x30\x01\x42\x02P\x01\x62\x06proto3')
-  ,
-  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,BluePrintCommon__pb2.DESCRIPTOR,])
-
-
-
-
-_EXECUTIONSERVICEINPUT = _descriptor.Descriptor(
-  name='ExecutionServiceInput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='actionIdentifiers', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput.actionIdentifiers', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='payload', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput.payload', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=139,
-  serialized_end=390,
-)
-
-
-_EXECUTIONSERVICEOUTPUT = _descriptor.Descriptor(
-  name='ExecutionServiceOutput',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='commonHeader', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput.commonHeader', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='actionIdentifiers', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput.actionIdentifiers', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput.status', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='payload', full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput.payload', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=393,
-  serialized_end=721,
-)
-
-_EXECUTIONSERVICEINPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_EXECUTIONSERVICEINPUT.fields_by_name['actionIdentifiers'].message_type = BluePrintCommon__pb2._ACTIONIDENTIFIERS
-_EXECUTIONSERVICEINPUT.fields_by_name['payload'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-_EXECUTIONSERVICEOUTPUT.fields_by_name['commonHeader'].message_type = BluePrintCommon__pb2._COMMONHEADER
-_EXECUTIONSERVICEOUTPUT.fields_by_name['actionIdentifiers'].message_type = BluePrintCommon__pb2._ACTIONIDENTIFIERS
-_EXECUTIONSERVICEOUTPUT.fields_by_name['status'].message_type = BluePrintCommon__pb2._STATUS
-_EXECUTIONSERVICEOUTPUT.fields_by_name['payload'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-DESCRIPTOR.message_types_by_name['ExecutionServiceInput'] = _EXECUTIONSERVICEINPUT
-DESCRIPTOR.message_types_by_name['ExecutionServiceOutput'] = _EXECUTIONSERVICEOUTPUT
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-ExecutionServiceInput = _reflection.GeneratedProtocolMessageType('ExecutionServiceInput', (_message.Message,), {
-  'DESCRIPTOR' : _EXECUTIONSERVICEINPUT,
-  '__module__' : 'BluePrintProcessing_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput)
-  })
-_sym_db.RegisterMessage(ExecutionServiceInput)
-
-ExecutionServiceOutput = _reflection.GeneratedProtocolMessageType('ExecutionServiceOutput', (_message.Message,), {
-  'DESCRIPTOR' : _EXECUTIONSERVICEOUTPUT,
-  '__module__' : 'BluePrintProcessing_pb2'
-  # @@protoc_insertion_point(class_scope:org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput)
-  })
-_sym_db.RegisterMessage(ExecutionServiceOutput)
-
-
-DESCRIPTOR._options = None
-
-_BLUEPRINTPROCESSINGSERVICE = _descriptor.ServiceDescriptor(
-  name='BluePrintProcessingService',
-  full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingService',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  serialized_start=724,
-  serialized_end=927,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='process',
-    full_name='org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingService.process',
-    index=0,
-    containing_service=None,
-    input_type=_EXECUTIONSERVICEINPUT,
-    output_type=_EXECUTIONSERVICEOUTPUT,
-    serialized_options=None,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_BLUEPRINTPROCESSINGSERVICE)
-
-DESCRIPTOR.services_by_name['BluePrintProcessingService'] = _BLUEPRINTPROCESSINGSERVICE
-
-# @@protoc_insertion_point(module_scope)
diff --git a/ms/py-executor/blueprints_grpc/proto/BluePrintProcessing_pb2_grpc.py b/ms/py-executor/blueprints_grpc/proto/BluePrintProcessing_pb2_grpc.py
deleted file mode 100644
index a482f56..0000000
--- a/ms/py-executor/blueprints_grpc/proto/BluePrintProcessing_pb2_grpc.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from blueprints_grpc.proto import BluePrintProcessing_pb2 as BluePrintProcessing__pb2
-
-
-class BluePrintProcessingServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.process = channel.stream_stream(
-        '/org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingService/process',
-        request_serializer=BluePrintProcessing__pb2.ExecutionServiceInput.SerializeToString,
-        response_deserializer=BluePrintProcessing__pb2.ExecutionServiceOutput.FromString,
-        )
-
-
-class BluePrintProcessingServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def process(self, request_iterator, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_BluePrintProcessingServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'process': grpc.stream_stream_rpc_method_handler(
-          servicer.process,
-          request_deserializer=BluePrintProcessing__pb2.ExecutionServiceInput.FromString,
-          response_serializer=BluePrintProcessing__pb2.ExecutionServiceOutput.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/ms/py-executor/blueprints_grpc/proto/__init__.py b/ms/py-executor/blueprints_grpc/proto/__init__.py
deleted file mode 100644
index b63c94c..0000000
--- a/ms/py-executor/blueprints_grpc/proto/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#  Copyright © 2018-2019 AT&T Intellectual Property.
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
diff --git a/ms/py-executor/blueprints_grpc/script_executor_configuration.py b/ms/py-executor/blueprints_grpc/script_executor_configuration.py
index 2f0553b..9f74607 100644
--- a/ms/py-executor/blueprints_grpc/script_executor_configuration.py
+++ b/ms/py-executor/blueprints_grpc/script_executor_configuration.py
@@ -42,7 +42,9 @@
 
 
 if __name__ == '__main__':
-    config_file = str(PurePath(Path().absolute())) + '/../configuration.ini'
+    default_configuration_file = str(PurePath(Path().absolute(), "../../configuration.ini"))
+    supplied_configuration_file = os.environ.get('CONFIGURATION')
+    config_file = str(os.path.expanduser(Path(supplied_configuration_file or default_configuration_file)))
     scriptExecutorConfiguration = ScriptExecutorConfiguration(config_file)
     blueprintDeployPath = scriptExecutorConfiguration.get_property('blueprintsprocessor', 'blueprintDeployPath')
     print(blueprintDeployPath)
diff --git a/ms/py-executor/client.py b/ms/py-executor/client.py
index c5bdc43..482bcbd 100644
--- a/ms/py-executor/client.py
+++ b/ms/py-executor/client.py
@@ -25,9 +25,9 @@
 #  limitations under the License.
 
 import grpc
-from blueprints_grpc.proto.BluePrintProcessing_pb2_grpc import BluePrintProcessingServiceStub
-from blueprints_grpc.proto.BluePrintProcessing_pb2 import ExecutionServiceInput
-from blueprints_grpc.proto.BluePrintCommon_pb2 import CommonHeader, ActionIdentifiers
+from proto.BluePrintCommon_pb2 import ActionIdentifiers, CommonHeader
+from proto.BluePrintProcessing_pb2 import ExecutionServiceInput
+from proto.BluePrintProcessing_pb2_grpc import BluePrintProcessingServiceStub
 
 
 def generate_messages():
diff --git a/ms/py-executor/docker/Dockerfile b/ms/py-executor/docker/Dockerfile
index 9e86cc8..043e15d 100644
--- a/ms/py-executor/docker/Dockerfile
+++ b/ms/py-executor/docker/Dockerfile
@@ -8,7 +8,7 @@
  && rm -rf /source.tar.gz \
  && rm -rf /tmp/@project.build.finalName@
 
-RUN pip install --no-cache-dir -r /opt/app/onap/python/requirements.txt
+RUN pip install --no-cache-dir -r /opt/app/onap/python/requirements/docker.txt
 
 VOLUME /opt/app/onap/blueprints/deploy/
 
diff --git a/ms/py-executor/docker/distribution.xml b/ms/py-executor/docker/distribution.xml
index 6d09be8..558ce2f 100755
--- a/ms/py-executor/docker/distribution.xml
+++ b/ms/py-executor/docker/distribution.xml
@@ -27,17 +27,42 @@
             <directory>${project.basedir}</directory>
             <outputDirectory>opt/app/onap/python</outputDirectory>
             <includes>
-                <include>blueprints_grpc/**/*.py</include>
+                <include>blueprints_grpc/*.py</include>
                 <include>*.py</include>
             </includes>
             <useDefaultExcludes>true</useDefaultExcludes>
         </fileSet>
         <fileSet>
+            <directory>${project.basedir}/../../py-modules</directory>
+            <outputDirectory>opt/app/onap/dependencies/</outputDirectory>
+            <includes>
+                <include>common/**/*.py</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/..</directory>
+            <outputDirectory>opt/app/onap/dependencies</outputDirectory>
+            <includes>
+                <include>artifact-manager/**/*.*</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/..</directory>
+            <outputDirectory>opt/app/onap</outputDirectory>
+            <includes>
+                <include>logging.yaml</include>
+                <include>configuration.ini</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+            <fileMode>0666</fileMode>
+        </fileSet>
+        <fileSet>
             <directory>${project.basedir}</directory>
             <outputDirectory>opt/app/onap/python</outputDirectory>
             <includes>
-                <include>requirements.txt</include>
-                <include>configuration.ini</include>
+                <include>requirements/*.txt</include>
             </includes>
             <useDefaultExcludes>true</useDefaultExcludes>
             <fileMode>0666</fileMode>
@@ -58,4 +83,4 @@
             <fileMode>0755</fileMode>
         </fileSet>
     </fileSets>
-</assembly>
\ No newline at end of file
+</assembly>
diff --git a/ms/py-executor/docker/start.sh b/ms/py-executor/docker/start.sh
index 3a3a9cb..6868ba0 100755
--- a/ms/py-executor/docker/start.sh
+++ b/ms/py-executor/docker/start.sh
@@ -22,12 +22,24 @@
   export APP_PORT=50052
 fi
 
+if [ -z "${ARTIFACT_MANAGER_PORT}" ]
+then
+  echo "ARTIFACT_MANAGER_PORT environment variable is not set, using default."
+  export ARTIFACT_MANAGER_PORT=50053
+fi
+
 if [ -z "${LOG_FILE}" ]
 then
   echo "LOG_FILE environment variable is not set, using default."
   export LOG_FILE="application.log"
 fi
 
+if [ -z "${ARTIFACT_MANAGER_SERVER_LOG_FILE}" ]
+then
+  echo "ARTIFACT_MANAGER_SERVER_LOG_FILE environment variable is not set, using default."
+  export ARTIFACT_MANAGER_SERVER_LOG_FILE="artifacts.log"
+fi
+
 if [ "${http_proxy}" ]
 then
   echo "Setting http_proxy: ${http_proxy}"
@@ -38,5 +50,12 @@
   echo "Setting https_proxy: ${https_proxy}"
 fi
 
+if [ -z "${CONFIGURATION}" ]
+then
+  echo "CONFIGURATION environment variable is not set, using default."
+  export CONFIGURATION="/opt/app/onap/configuration.ini"
+fi
+
+
 cd /opt/app/onap/python/
 python server.py
\ No newline at end of file
diff --git a/ms/py-executor/requirements/docker.txt b/ms/py-executor/requirements/docker.txt
new file mode 100644
index 0000000..58469c9
--- /dev/null
+++ b/ms/py-executor/requirements/docker.txt
@@ -0,0 +1,4 @@
+-r shared.txt
+/opt/app/onap/dependencies/common
+-r /opt/app/onap/dependencies/artifact-manager/requirements/docker.txt
+/opt/app/onap/dependencies/artifact-manager
\ No newline at end of file
diff --git a/ms/py-executor/requirements/local.txt b/ms/py-executor/requirements/local.txt
new file mode 100644
index 0000000..74cc76e
--- /dev/null
+++ b/ms/py-executor/requirements/local.txt
@@ -0,0 +1,4 @@
+-r shared.txt
+../../py-modules/common
+-r ../../artifact-manager/requirements/local.txt
+../artifact-manager
\ No newline at end of file
diff --git a/ms/py-executor/requirements.txt b/ms/py-executor/requirements/shared.txt
similarity index 98%
rename from ms/py-executor/requirements.txt
rename to ms/py-executor/requirements/shared.txt
index 14b4c29..2283201 100644
--- a/ms/py-executor/requirements.txt
+++ b/ms/py-executor/requirements/shared.txt
@@ -3,4 +3,4 @@
 configparser==4.0.2
 requests==2.22.0
 ncclient==0.6.6
-ansible==2.8.5
\ No newline at end of file
+ansible==2.8.5
diff --git a/ms/py-executor/test-requirements.txt b/ms/py-executor/requirements/test.txt
similarity index 63%
rename from ms/py-executor/test-requirements.txt
rename to ms/py-executor/requirements/test.txt
index 79ed6ee..5304eac 100644
--- a/ms/py-executor/test-requirements.txt
+++ b/ms/py-executor/requirements/test.txt
@@ -1,3 +1,3 @@
 pytest==5.3.1
 pytest-grpc==0.7.0
--r requirements.txt
\ No newline at end of file
+-r local.txt
\ No newline at end of file
diff --git a/ms/py-executor/resource_resolution/README b/ms/py-executor/resource_resolution/README
index a2d1542..222dae4 100644
--- a/ms/py-executor/resource_resolution/README
+++ b/ms/py-executor/resource_resolution/README
@@ -5,8 +5,8 @@
 ### Insecure channel
 
 ```
-from blueprints_grpc.proto.BluePrintCommon_pb2_grpc import ActionIdentifiers, CommonHeader
-from blueprints_grpc.proto.BluePrintProcessing_pb2_grpc import ExecutionServiceInput
+from proto.BluePrintCommon_pb2_grpc import ActionIdentifiers, CommonHeader
+from proto.BluePrintProcessing_pb2_grpc import ExecutionServiceInput
 from resource_resolution.client import Client as ResourceResolutionClient
 
 
@@ -43,8 +43,8 @@
 ### Secure channel
 
 ```
-from blueprints_grpc.proto.BluePrintCommon_pb2_grpc import ActionIdentifiers, CommonHeader
-from blueprints_grpc.proto.BluePrintProcessing_pb2_grpc import ExecutionServiceInput
+from proto.BluePrintCommon_pb2_grpc import ActionIdentifiers, CommonHeader
+from proto.BluePrintProcessing_pb2_grpc import ExecutionServiceInput
 from resource_resolution.client import Client as ResourceResolutionClient
 
 
diff --git a/ms/py-executor/resource_resolution/client.py b/ms/py-executor/resource_resolution/client.py
index 913b0ed..8908774 100644
--- a/ms/py-executor/resource_resolution/client.py
+++ b/ms/py-executor/resource_resolution/client.py
@@ -12,14 +12,13 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 """
-from logging import getLogger, Logger
+from logging import Logger, getLogger
 from types import TracebackType
 from typing import Iterable, List, Optional, Type
 
 from grpc import Channel, insecure_channel, secure_channel, ssl_channel_credentials
-
-from blueprints_grpc.proto.BluePrintProcessing_pb2 import ExecutionServiceInput, ExecutionServiceOutput
-from blueprints_grpc.proto.BluePrintProcessing_pb2_grpc import BluePrintProcessingServiceStub
+from proto.BluePrintProcessing_pb2 import ExecutionServiceInput, ExecutionServiceOutput
+from proto.BluePrintProcessing_pb2_grpc import BluePrintProcessingServiceStub
 
 
 class Client:
diff --git a/ms/py-executor/server.py b/ms/py-executor/server.py
index f506e94..7f65370 100644
--- a/ms/py-executor/server.py
+++ b/ms/py-executor/server.py
@@ -15,16 +15,20 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
+import logging
+import os
+import time
 from builtins import KeyboardInterrupt
 from concurrent import futures
-import logging
-import time
-import grpc
 from pathlib import Path, PurePath
-from blueprints_grpc import BluePrintProcessing_pb2_grpc
-from blueprints_grpc.request_header_validator_interceptor import RequestHeaderValidatorInterceptor
+
+import grpc
+from manager.servicer import ArtifactManagerServicer
+from proto.BluePrintManagement_pb2_grpc import add_BluePrintManagementServiceServicer_to_server
+
+from blueprints_grpc import BluePrintProcessing_pb2_grpc, ScriptExecutorConfiguration
 from blueprints_grpc.blueprint_processing_server import BluePrintProcessingServer
-from blueprints_grpc import ScriptExecutorConfiguration
+from blueprints_grpc.request_header_validator_interceptor import RequestHeaderValidatorInterceptor
 
 logger = logging.getLogger("Server")
 
@@ -53,7 +57,9 @@
         # create server
         server = grpc.server(futures.ThreadPoolExecutor(max_workers=int(maxWorkers)))
         BluePrintProcessing_pb2_grpc.add_BluePrintProcessingServiceServicer_to_server(
-            BluePrintProcessingServer(configuration), server)
+            BluePrintProcessingServer(configuration), server
+        )
+        add_BluePrintManagementServiceServicer_to_server(ArtifactManagerServicer(), server)
 
         # add secure port using credentials
         server.add_secure_port('[::]:' + port, server_credentials)
@@ -68,7 +74,9 @@
         server = grpc.server(futures.ThreadPoolExecutor(max_workers=int(maxWorkers)),
                              interceptors=(header_validator,))
         BluePrintProcessing_pb2_grpc.add_BluePrintProcessingServiceServicer_to_server(
-            BluePrintProcessingServer(configuration), server)
+            BluePrintProcessingServer(configuration), server
+        )
+        add_BluePrintManagementServiceServicer_to_server(ArtifactManagerServicer(), server)
 
         server.add_insecure_port('[::]:' + port)
         server.start()
@@ -83,7 +91,10 @@
 
 
 if __name__ == '__main__':
-    config_file = str(PurePath(Path().absolute())) + '/configuration.ini'
+    default_configuration_file = str(PurePath(Path().absolute(), "../../configuration.ini"))
+    supplied_configuration_file = os.environ.get("CONFIGURATION")
+    config_file = str(os.path.expanduser(Path(supplied_configuration_file or default_configuration_file)))
+
     configuration = ScriptExecutorConfiguration(config_file)
     logging_formater = '%(asctime)s - %(name)s - %(threadName)s - %(levelname)s - %(message)s'
     logging.basicConfig(filename=configuration.script_executor_property('logFile'),
diff --git a/ms/py-executor/tox.ini b/ms/py-executor/tox.ini
index 8cf1776..d722ed4 100644
--- a/ms/py-executor/tox.ini
+++ b/ms/py-executor/tox.ini
@@ -3,9 +3,9 @@
 skipsdist=True
 [testenv]
 setenv =
-    CONFIGURATION = configuration-local.ini
+    CONFIGURATION = {toxinidir}/../configuration-local.ini
 deps =
-    -rtest-requirements.txt
+    -rrequirements/test.txt
 commands = pytest resource_resolution/
 [testenv:codelint]
 deps =
@@ -18,8 +18,8 @@
 [testenv:coverage]
 basepython = python3.7
 setenv = 
-    CONFIGURATION = configuration-local.ini
+    CONFIGURATION = {toxinidir}/../configuration-local.ini
 deps =
-    -rtest-requirements.txt
+    -rrequirements/test.txt
     pytest-cov
 commands = pytest --cov=manager --cov=resource_resolution --cov-fail-under=60 --cov-config={toxinidir}/.coveragerc resource_resolution/