diff --git a/policy_module/.gitignore b/policy_module/.gitignore
deleted file mode 100644
index 88a8391..0000000
--- a/policy_module/.gitignore
+++ /dev/null
@@ -1,60 +0,0 @@
-*.py[cod]
-
-# C extensions
-*.so
-
-# log files
-*.log
-
-# Packages
-*.egg
-*.egg-info
-dist
-build
-.eggs
-eggs
-parts
-bin
-var
-sdist
-develop-eggs
-.installed.cfg
-lib
-lib64
-nohup.out
-
-# Installer logs
-pip-log.txt
-
-# Unit test / coverage reports
-.coverage
-.tox
-nosetests.xml
-.testrepository
-.venv
-.cache
-
-# Translations
-*.mo
-
-# Complexity
-output/*.html
-output/*/index.html
-
-# Sphinx
-doc/build
-
-# pbr generates these
-AUTHORS
-ChangeLog
-
-# Editors
-*~
-.*.swp
-.*sw?
-.settings/
-__pycache__/
-.idea
-
-*.db
-test.config
\ No newline at end of file
diff --git a/policy_module/Dockerfile b/policy_module/Dockerfile
deleted file mode 100644
index 553ed7b..0000000
--- a/policy_module/Dockerfile
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-
-FROM ubuntu:16.04
-
-LABEL authors="Benjamín Díaz"
-
-RUN apt-get --yes update \
- && apt-get --yes install python3 python3-pip libmysqlclient-dev git \
- && pip3 install pip==9.0.3
-
-COPY requirements.txt /policy_module/requirements.txt
-
-RUN pip3 install -r /policy_module/requirements.txt
-
-COPY . /policy_module
-
-RUN pip3 install /policy_module
-
-CMD bash /policy_module/scripts/gen_config_from_env.sh && osm-policy-agent --config osm_policy_agent.cfg
diff --git a/policy_module/MANIFEST.in b/policy_module/MANIFEST.in
deleted file mode 100644
index 06cf953..0000000
--- a/policy_module/MANIFEST.in
+++ /dev/null
@@ -1,3 +0,0 @@
-include requirements.txt
-include README.rst
-recursive-include osm_policy_module
\ No newline at end of file
diff --git a/policy_module/README.rst b/policy_module/README.rst
deleted file mode 100644
index 5cb2fde..0000000
--- a/policy_module/README.rst
+++ /dev/null
@@ -1,14 +0,0 @@
-Install
-------------------------
-    ::
-
-        git clone https://osm.etsi.org/gerrit/osm/MON.git
-        cd MON/policy_module
-        pip install .
-
-Run
-------------------------
-    ::
-
-        osm-policy-agent
-
diff --git a/policy_module/config.example b/policy_module/config.example
deleted file mode 100644
index 45e4f17..0000000
--- a/policy_module/config.example
+++ /dev/null
@@ -1,4 +0,0 @@
-[policy_module]
-kafka_server_host=localhost
-kafka_server_port=9092
-log_dir=
\ No newline at end of file
diff --git a/policy_module/osm_policy_module/__init__.py b/policy_module/osm_policy_module/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/cmd/__init__.py b/policy_module/osm_policy_module/cmd/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/cmd/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/cmd/policy_module_agent.py b/policy_module/osm_policy_module/cmd/policy_module_agent.py
deleted file mode 100644
index ac03167..0000000
--- a/policy_module/osm_policy_module/cmd/policy_module_agent.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import argparse
-import logging
-import sys
-import logstash
-
-from osm_policy_module.core.agent import PolicyModuleAgent
-from osm_policy_module.core.config import Config
-from osm_policy_module.core.database import DatabaseManager
-
-
-def main():
-    cfg = Config.instance()
-    parser = argparse.ArgumentParser(prog='pm-scaling-config-agent')
-    parser.add_argument('--config-file', nargs='?', help='Policy module agent configuration file')
-    args = parser.parse_args()
-    if args.config_file:
-        cfg.load_file(args.config_file)
-    # TODO: Handle different log levels in config
-    if cfg.get('policy_module', 'log_dir') == 'stdout':
-        logging.basicConfig(stream=sys.stdout,
-                            format='%(asctime)s %(message)s',
-                            datefmt='%m/%d/%Y %I:%M:%S %p',
-                            level=logging.INFO)
-    else:
-        logging.basicConfig(filename=cfg.get('policy_module', 'log_dir') + 'pm_agent.log',
-                            format='%(asctime)s %(message)s',
-                            datefmt='%m/%d/%Y %I:%M:%S %p', filemode='a',
-                            level=logging.INFO)
-    if cfg.get('policy_module', 'enable_logstash_handler') == 'true':
-        logstash_host = cfg.get('policy_module', 'logstash_host')
-        logstash_port = int(cfg.get('policy_module', 'logstash_port'))
-        root_logger = logging.getLogger()
-        root_logger.addHandler(logstash.TCPLogstashHandler(logstash_host, logstash_port, version=1))
-        root_logger.info("Logstash handler configured.")
-    kafka_logger = logging.getLogger('kafka')
-    kafka_logger.setLevel(logging.WARN)
-    kafka_formatter = logging.Formatter(
-        '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-    kafka_handler = logging.StreamHandler(sys.stdout)
-    kafka_handler.setFormatter(kafka_formatter)
-    kafka_logger.addHandler(kafka_handler)
-    log = logging.getLogger(__name__)
-    log.info("Config: %s", cfg)
-    log.info("Syncing database...")
-    db_manager = DatabaseManager()
-    db_manager.create_tables()
-    log.info("Database synced correctly.")
-    log.info("Starting policy module agent...")
-    agent = PolicyModuleAgent()
-    agent.run()
-
-
-if __name__ == '__main__':
-    main()
diff --git a/policy_module/osm_policy_module/common/__init__.py b/policy_module/osm_policy_module/common/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/common/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/common/alarm_config.py b/policy_module/osm_policy_module/common/alarm_config.py
deleted file mode 100644
index cf26a92..0000000
--- a/policy_module/osm_policy_module/common/alarm_config.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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 Lcompletoicense 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-
-
-class AlarmConfig:
-    def __init__(self, metric_name, vdu_name, vnf_member_index, threshold, operation, statistic, action):
-        self.metric_name = metric_name
-        self.vdu_name = vdu_name
-        self.vnf_member_index = vnf_member_index
-        self.threshold = threshold
-        self.operation = operation
-        self.statistic = statistic
-        self.action = action
diff --git a/policy_module/osm_policy_module/common/lcm_client.py b/policy_module/osm_policy_module/common/lcm_client.py
deleted file mode 100644
index be44efe..0000000
--- a/policy_module/osm_policy_module/common/lcm_client.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import json
-import logging
-
-from kafka import KafkaProducer
-
-from osm_policy_module.core.config import Config
-
-log = logging.getLogger(__name__)
-
-
-class LcmClient:
-    def __init__(self):
-        cfg = Config.instance()
-        self.kafka_server = '{}:{}'.format(cfg.get('policy_module', 'kafka_server_host'),
-                                           cfg.get('policy_module', 'kafka_server_port'))
-        self.producer = KafkaProducer(bootstrap_servers=self.kafka_server,
-                                      key_serializer=str.encode,
-                                      value_serializer=str.encode)
-
-    def scale(self, nsr_id: str, name: str, action: str):
-        msg = self._create_scale_action_payload(nsr_id, name, action)
-        log.info("Sending scale action message: %s", json.dumps(msg))
-        self.producer.send(topic='lcm_pm', key='trigger_scaling', value=json.dumps(msg))
-        self.producer.flush()
-
-    def _create_scale_action_payload(self, nsr_id: str, name: str, action: str):
-        msg = {
-            "ns_id": nsr_id,
-            "scaling_group_descriptor": {
-                "name": name,
-                "action": action
-            }
-        }
-        return msg
diff --git a/policy_module/osm_policy_module/common/mon_client.py b/policy_module/osm_policy_module/common/mon_client.py
deleted file mode 100644
index d1336db..0000000
--- a/policy_module/osm_policy_module/common/mon_client.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import json
-import logging
-import random
-import uuid
-
-from kafka import KafkaProducer, KafkaConsumer
-
-from osm_policy_module.core.config import Config
-
-log = logging.getLogger(__name__)
-
-
-class MonClient:
-    def __init__(self):
-        cfg = Config.instance()
-        self.kafka_server = '{}:{}'.format(cfg.get('policy_module', 'kafka_server_host'),
-                                           cfg.get('policy_module', 'kafka_server_port'))
-        self.producer = KafkaProducer(bootstrap_servers=self.kafka_server,
-                                      key_serializer=str.encode,
-                                      value_serializer=str.encode)
-
-    def create_alarm(self, metric_name: str, ns_id: str, vdu_name: str, vnf_member_index: str, threshold: int,
-                     statistic: str, operation: str):
-        cor_id = random.randint(1, 1000000)
-        msg = self._create_alarm_payload(cor_id, metric_name, ns_id, vdu_name, vnf_member_index, threshold, statistic,
-                                         operation)
-        log.info("Sending create_alarm_request %s", msg)
-        future = self.producer.send(topic='alarm_request', key='create_alarm_request', value=json.dumps(msg))
-        future.get(timeout=60)
-        consumer = KafkaConsumer(bootstrap_servers=self.kafka_server,
-                                 key_deserializer=bytes.decode,
-                                 value_deserializer=bytes.decode,
-                                 consumer_timeout_ms=10000)
-        consumer.subscribe(['alarm_response'])
-        for message in consumer:
-            if message.key == 'create_alarm_response':
-                content = json.loads(message.value)
-                log.info("Received create_alarm_response %s", content)
-                if self._is_alarm_response_correlation_id_eq(cor_id, content):
-                    alarm_uuid = content['alarm_create_response']['alarm_uuid']
-                    # TODO Handle error response
-                    return alarm_uuid
-
-        raise ValueError('Timeout: No alarm creation response from MON. Is MON up?')
-
-    def _create_alarm_payload(self, cor_id: int, metric_name: str, ns_id: str, vdu_name: str, vnf_member_index: str,
-                              threshold: int, statistic: str, operation: str):
-        alarm_create_request = {
-            'correlation_id': cor_id,
-            'alarm_name': str(uuid.uuid4()),
-            'metric_name': metric_name,
-            'ns_id': ns_id,
-            'vdu_name': vdu_name,
-            'vnf_member_index': vnf_member_index,
-            'operation': operation,
-            'severity': 'critical',
-            'threshold_value': threshold,
-            'statistic': statistic
-        }
-        msg = {
-            'alarm_create_request': alarm_create_request,
-        }
-        return msg
-
-    def _is_alarm_response_correlation_id_eq(self, cor_id, message_content):
-        return message_content['alarm_create_response']['correlation_id'] == cor_id
diff --git a/policy_module/osm_policy_module/core/__init__.py b/policy_module/osm_policy_module/core/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/core/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/core/agent.py b/policy_module/osm_policy_module/core/agent.py
deleted file mode 100644
index cdd5dfc..0000000
--- a/policy_module/osm_policy_module/core/agent.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import json
-import logging
-from typing import Dict, List
-
-import yaml
-from kafka import KafkaConsumer
-from osm_policy_module.common.alarm_config import AlarmConfig
-from osm_policy_module.common.lcm_client import LcmClient
-from osm_policy_module.common.mon_client import MonClient
-from osm_policy_module.core.config import Config
-from osm_policy_module.core.database import ScalingRecord, ScalingAlarm
-
-log = logging.getLogger(__name__)
-
-
-class PolicyModuleAgent:
-    def run(self):
-        cfg = Config.instance()
-        # Initialize servers
-        kafka_server = '{}:{}'.format(cfg.get('policy_module', 'kafka_server_host'),
-                                      cfg.get('policy_module', 'kafka_server_port'))
-
-        # Initialize Kafka consumer
-        log.info("Connecting to Kafka server at %s", kafka_server)
-        consumer = KafkaConsumer(bootstrap_servers=kafka_server,
-                                 key_deserializer=bytes.decode,
-                                 value_deserializer=bytes.decode,
-                                 group_id="pm-consumer")
-        consumer.subscribe(['lcm_pm', 'alarm_response'])
-
-        for message in consumer:
-            log.info("Message arrived: %s", message)
-            try:
-                if message.key == 'configure_scaling':
-                    try:
-                        content = json.loads(message.value)
-                    except:
-                        content = yaml.safe_load(message.value)
-                    log.info("Creating scaling record in DB")
-                    # TODO: Use transactions: http://docs.peewee-orm.com/en/latest/peewee/transactions.html
-                    scaling_record = ScalingRecord.create(
-                        nsr_id=content['ns_id'],
-                        name=content['scaling_group_descriptor']['name'],
-                        content=json.dumps(content)
-                    )
-                    log.info("Created scaling record in DB : nsr_id=%s, name=%s, content=%s",
-                             scaling_record.nsr_id,
-                             scaling_record.name,
-                             scaling_record.content)
-                    alarm_configs = self._get_alarm_configs(content)
-                    for config in alarm_configs:
-                        mon_client = MonClient()
-                        log.info("Creating alarm record in DB")
-                        alarm_uuid = mon_client.create_alarm(
-                            metric_name=config.metric_name,
-                            ns_id=scaling_record.nsr_id,
-                            vdu_name=config.vdu_name,
-                            vnf_member_index=config.vnf_member_index,
-                            threshold=config.threshold,
-                            operation=config.operation,
-                            statistic=config.statistic
-                        )
-                        ScalingAlarm.create(
-                            alarm_id=alarm_uuid,
-                            action=config.action,
-                            scaling_record=scaling_record
-                        )
-                if message.key == 'notify_alarm':
-                    content = json.loads(message.value)
-                    alarm_id = content['notify_details']['alarm_uuid']
-                    metric_name = content['notify_details']['metric_name']
-                    operation = content['notify_details']['operation']
-                    threshold = content['notify_details']['threshold_value']
-                    vdu_name = content['notify_details']['vdu_name']
-                    vnf_member_index = content['notify_details']['vnf_member_index']
-                    ns_id = content['notify_details']['ns_id']
-                    log.info(
-                        "Received alarm notification for alarm %s, \
-                        metric %s, \
-                        operation %s, \
-                        threshold %s, \
-                        vdu_name %s, \
-                        vnf_member_index %s, \
-                        ns_id %s ",
-                        alarm_id, metric_name, operation, threshold, vdu_name, vnf_member_index, ns_id)
-                    try:
-                        alarm = ScalingAlarm.select().where(ScalingAlarm.alarm_id == alarm_id).get()
-                        lcm_client = LcmClient()
-                        log.info("Sending scaling action message for ns: %s", alarm_id)
-                        lcm_client.scale(alarm.scaling_record.nsr_id, alarm.scaling_record.name, alarm.action)
-                    except ScalingAlarm.DoesNotExist:
-                        log.info("There is no action configured for alarm %s.", alarm_id)
-            except Exception:
-                log.exception("Error consuming message: ")
-
-    def _get_alarm_configs(self, message_content: Dict) -> List[AlarmConfig]:
-        scaling_criterias = message_content['scaling_group_descriptor']['scaling_policy']['scaling_criteria']
-        alarm_configs = []
-        for criteria in scaling_criterias:
-            metric_name = ''
-            scale_out_threshold = criteria['scale_out_threshold']
-            scale_in_threshold = criteria['scale_in_threshold']
-            scale_out_operation = criteria['scale_out_relational_operation']
-            scale_in_operation = criteria['scale_in_relational_operation']
-            statistic = criteria['monitoring_param']['aggregation_type']
-            vdu_name = ''
-            vnf_member_index = ''
-            if 'vdu_monitoring_param' in criteria['monitoring_param']:
-                vdu_name = criteria['monitoring_param']['vdu_monitoring_param']['vdu_name']
-                vnf_member_index = criteria['monitoring_param']['vdu_monitoring_param']['vnf_member_index']
-                metric_name = criteria['monitoring_param']['vdu_monitoring_param']['name']
-            if 'vnf_metric' in criteria['monitoring_param']:
-                # TODO vnf_metric
-                continue
-            if 'vdu_metric' in criteria['monitoring_param']:
-                # TODO vdu_metric
-                continue
-            scale_out_alarm_config = AlarmConfig(metric_name,
-                                                 vdu_name,
-                                                 vnf_member_index,
-                                                 scale_out_threshold,
-                                                 scale_out_operation,
-                                                 statistic,
-                                                 'scale_out')
-            scale_in_alarm_config = AlarmConfig(metric_name,
-                                                vdu_name,
-                                                vnf_member_index,
-                                                scale_in_threshold,
-                                                scale_in_operation,
-                                                statistic,
-                                                'scale_in')
-            alarm_configs.append(scale_in_alarm_config)
-            alarm_configs.append(scale_out_alarm_config)
-        return alarm_configs
diff --git a/policy_module/osm_policy_module/core/config.py b/policy_module/osm_policy_module/core/config.py
deleted file mode 100644
index 9899009..0000000
--- a/policy_module/osm_policy_module/core/config.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##"""Global Configuration."""
-
-import logging
-
-from osm_policy_module.core.singleton import Singleton
-
-try:
-    from configparser import ConfigParser
-except ImportError:
-    from ConfigParser import ConfigParser
-
-log = logging.getLogger(__name__)
-
-
-@Singleton
-class Config(object):
-    """Global configuration."""
-
-    def __init__(self):
-        # Default config values
-        self.config = {
-            'policy_module': {
-                'kafka_server_host': '127.0.0.1',
-                'kafka_server_port': '9092',
-                'log_dir': 'stdout',
-                'log_level': 'INFO',
-                'enable_logstash_handler': 'false',
-                'logstash_host': 'logstash',
-                'logstash_port': '5000'
-            },
-        }
-
-    def load_file(self, config_file_path):
-        if config_file_path:
-            config_parser = ConfigParser()
-            config_parser.read(config_file_path)
-            for section in config_parser.sections():
-                for key, value in config_parser.items(section):
-                    if section not in self.config:
-                        self.config[section] = {}
-                    self.config[section][key] = value
-
-    def get(self, group, name=None, default=None):
-        if group in self.config:
-            if name is None:
-                return self.config[group]
-            return self.config[group].get(name, default)
-        return default
-
-    def __str__(self):
-        return str(self.config)
diff --git a/policy_module/osm_policy_module/core/database.py b/policy_module/osm_policy_module/core/database.py
deleted file mode 100644
index 0757b7b..0000000
--- a/policy_module/osm_policy_module/core/database.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import logging
-
-from peewee import *
-from playhouse.sqlite_ext import SqliteExtDatabase
-
-from osm_policy_module.core.config import Config
-
-log = logging.getLogger(__name__)
-cfg = Config.instance()
-
-db = SqliteExtDatabase('policy_module.db')
-
-
-class BaseModel(Model):
-    class Meta:
-        database = db
-
-
-class ScalingRecord(BaseModel):
-    nsr_id = CharField()
-    name = CharField()
-    content = TextField()
-
-
-class ScalingAlarm(BaseModel):
-    alarm_id = CharField()
-    action = CharField()
-    scaling_record = ForeignKeyField(ScalingRecord, related_name='scaling_alarms')
-
-
-class DatabaseManager:
-    def create_tables(self):
-        try:
-            db.connect()
-            db.create_tables([ScalingRecord, ScalingAlarm])
-            db.close()
-        except Exception as e:
-            log.exception("Error creating tables: ")
diff --git a/policy_module/osm_policy_module/core/singleton.py b/policy_module/osm_policy_module/core/singleton.py
deleted file mode 100644
index 9fb571b..0000000
--- a/policy_module/osm_policy_module/core/singleton.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##"""Simple singleton class."""
-
-from __future__ import unicode_literals
-
-
-class Singleton(object):
-    """Simple singleton class."""
-
-    def __init__(self, decorated):
-        """Initialize singleton instance."""
-        self._decorated = decorated
-
-    def instance(self):
-        """Return singleton instance."""
-        try:
-            return self._instance
-        except AttributeError:
-            self._instance = self._decorated()
-            return self._instance
diff --git a/policy_module/osm_policy_module/models/configure_scaling.json b/policy_module/osm_policy_module/models/configure_scaling.json
deleted file mode 100644
index 0a87491..0000000
--- a/policy_module/osm_policy_module/models/configure_scaling.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
-  "$schema": "http://json-schema.org/schema#",
-  "type": "object",
-  "properties": {
-    "ns_id": {
-      "type": "string"
-    },
-    "scaling_group_descriptor": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string"
-        },
-        "scaling_policy": {
-          "type": "object",
-          "properties": {
-            "scale_in_operation_type": {
-              "type": "string",
-              "enum": [
-                "and",
-                "or"
-              ]
-            },
-            "scale_out_operation_type": {
-              "type": "string",
-              "enum": [
-                "and",
-                "or"
-              ]
-            },
-            "threshold_time": {
-              "type": "number"
-            },
-            "cooldown_time": {
-              "type": "number"
-            },
-            "scaling_criteria": {
-              "type": "array",
-              "items": {
-                "type": "object",
-                "properties": {
-                  "scale_in_threshold": {
-                    "type": "number"
-                  },
-                  "scale_out_threshold": {
-                    "type": "number"
-                  },
-                  "scale_in_relational_operation": {
-                    "type": "string",
-                    "enum": [
-                      "lt",
-                      "gt",
-                      "le",
-                      "ge",
-                      "eq"
-                    ]
-                  },
-                  "scale_out_relational_operation": {
-                    "type": "string",
-                    "enum": [
-                      "lt",
-                      "gt",
-                      "le",
-                      "ge",
-                      "eq"
-                    ]
-                  },
-                  "monitoring_param": {
-                    "type": "object",
-                    "properties": {
-                      "id": {
-                        "type": "string"
-                      },
-                      "name": {
-                        "type": "string"
-                      },
-                      "aggregation_type": {
-                        "type": "string",
-                        "enum": [
-                          "average",
-                          "maximum",
-                          "minimum",
-                          "count",
-                          "sum"
-                        ]
-                      },
-                      "vdu_monitoring_param": {
-                        "type": "object",
-                        "properties": {
-                          "vnf_member_index": {
-                            "type": "string"
-                          },
-                          "vdu_name": {
-                            "type": "string"
-                          },
-                          "name": {
-                            "type": "string"
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/policy_module/osm_policy_module/tests/__init__.py b/policy_module/osm_policy_module/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/tests/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/tests/examples/configure_scaling_full_example.json b/policy_module/osm_policy_module/tests/examples/configure_scaling_full_example.json
deleted file mode 100644
index eab1cc7..0000000
--- a/policy_module/osm_policy_module/tests/examples/configure_scaling_full_example.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "ns_id": "360b400b-86dc-4b8e-a139-b7fc3987cf69",
-  "scaling_group_descriptor": {
-    "name": "test",
-    "scaling_policy": {
-      "scale_in_operation_type": "or",
-      "scale_out_operation_type": "or",
-      "threshold_time": 10,
-      "cooldown_time": 10,
-      "scaling_criteria": [
-        {
-          "scale_in_threshold": 50,
-          "scale_out_threshold": 50,
-          "scale_in_relational_operation": "lt",
-          "scale_out_relational_operation": "gt",
-          "monitoring_param": {
-            "id": "test_param_id",
-            "name": "test_param",
-            "aggregation_type": "average",
-            "vdu_monitoring_param": {
-              "vnf_member_index": "1",
-              "vdu_name": "2d8d5355-acf7-42be-9f34-a10d02f9df39",
-              "name": "cpu_utilization"
-            }
-          }
-        }
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/policy_module/osm_policy_module/tests/integration/__init__.py b/policy_module/osm_policy_module/tests/integration/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/tests/integration/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/tests/integration/test_scaling_config_kafka_msg.py b/policy_module/osm_policy_module/tests/integration/test_scaling_config_kafka_msg.py
deleted file mode 100644
index aea3f4a..0000000
--- a/policy_module/osm_policy_module/tests/integration/test_scaling_config_kafka_msg.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import json
-import logging
-import os
-import unittest
-
-from kafka import KafkaProducer, KafkaConsumer
-from kafka.errors import KafkaError
-
-log = logging.getLogger(__name__)
-
-
-class ScalingConfigTest(unittest.TestCase):
-    def setUp(self):
-        try:
-            kafka_server = '{}:{}'.format(os.getenv("KAFKA_SERVER_HOST", "localhost"),
-                                          os.getenv("KAFKA_SERVER_PORT", "9092"))
-            self.producer = KafkaProducer(bootstrap_servers=kafka_server,
-                                          key_serializer=str.encode,
-                                          value_serializer=str.encode)
-            self.consumer = KafkaConsumer(bootstrap_servers='localhost:9092',
-                                          group_id='osm_mon')
-            self.consumer.subscribe(['lcm_pm'])
-        except KafkaError:
-            self.skipTest('Kafka server not present.')
-
-    def test_send_scaling_config_msg(self):
-        try:
-            with open(
-                    os.path.join(os.path.dirname(__file__), '../examples/configure_scaling_full_example.json')) as file:
-                payload = json.load(file)
-                future = self.producer.send('lcm_pm', json.dumps(payload), key="configure_scaling")
-                result = future.get(timeout=60)
-                log.info('Result: %s', result)
-
-                self.producer.flush()
-                # TODO: Improve assertions
-                self.assertIsNotNone(result)
-        except Exception as e:
-            self.fail(e)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/policy_module/osm_policy_module/tests/unit/__init__.py b/policy_module/osm_policy_module/tests/unit/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/policy_module/osm_policy_module/tests/unit/__init__.py
+++ /dev/null
diff --git a/policy_module/osm_policy_module/tests/unit/test_examples.py b/policy_module/osm_policy_module/tests/unit/test_examples.py
deleted file mode 100644
index 97b3370..0000000
--- a/policy_module/osm_policy_module/tests/unit/test_examples.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import json
-import unittest
-
-import os
-
-from jsonschema import validate
-
-
-class ExamplesTest(unittest.TestCase):
-    def test_examples_schema(self):
-        example_file_path = os.path.join(os.path.dirname(__file__), '../examples/configure_scaling_full_example.json')
-        schema_file_path = os.path.join(os.path.dirname(__file__), '../../models/configure_scaling.json')
-        with open(example_file_path) as example_file, open(schema_file_path) as schema_file:
-            validate(json.load(example_file), json.load(schema_file))
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/policy_module/osm_policy_module/tests/unit/test_policy_agent.py b/policy_module/osm_policy_module/tests/unit/test_policy_agent.py
deleted file mode 100644
index 0e12e84..0000000
--- a/policy_module/osm_policy_module/tests/unit/test_policy_agent.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import json
-import os
-import unittest
-
-from osm_policy_module.core.agent import PolicyModuleAgent
-
-
-class PolicyAgentTest(unittest.TestCase):
-    def setUp(self):
-        self.agent = PolicyModuleAgent()
-
-    def test_get_alarm_configs(self):
-        with open(os.path.join(os.path.dirname(__file__), '../examples/configure_scaling_full_example.json')) as file:
-            example = json.load(file)
-            alarm_configs = self.agent._get_alarm_configs(example)
-            # TODO Improve assertions
-            self.assertEqual(len(alarm_configs), 2)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/policy_module/requirements.txt b/policy_module/requirements.txt
deleted file mode 100644
index ad2c105..0000000
--- a/policy_module/requirements.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-kafka==1.3.*
-peewee==3.1.*
-jsonschema==2.6.*
-six==1.11.*
-pyyaml==3.*
-python-logstash==0.4.*
-git+https://osm.etsi.org/gerrit/osm/common.git@v4.0.1#egg=osm-common
\ No newline at end of file
diff --git a/policy_module/scripts/gen_config_from_env.sh b/policy_module/scripts/gen_config_from_env.sh
deleted file mode 100644
index 3dcaf67..0000000
--- a/policy_module/scripts/gen_config_from_env.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-CONFIG_FILENAME="osm_policy_agent.cfg"
-rm $CONFIG_FILENAME 2> /dev/null
-touch $CONFIG_FILENAME
-echo "[policy_module]" >> $CONFIG_FILENAME
-if ! [[ -z "${BROKER_URI}" ]]; then
-    HOST=$(echo $BROKER_URI | cut -d: -f1)
-    PORT=$(echo $BROKER_URI | cut -d: -f2)
-    echo "kafka_server_host=$HOST" >> $CONFIG_FILENAME
-    echo "kafka_server_port=$PORT" >> $CONFIG_FILENAME
-fi
-if ! [[ -z "${LOGSTASH_URI}" ]]; then
-    HOST=$(echo $LOGSTASH_URI | cut -d: -f1)
-    PORT=$(echo $LOGSTASH_URI | cut -d: -f2)
-    echo "enable_logstash_handler=true" >> $CONFIG_FILENAME
-    echo "logstash_host=$HOST" >> $CONFIG_FILENAME
-    echo "logstash_port=$PORT" >> $CONFIG_FILENAME
-fi
\ No newline at end of file
diff --git a/policy_module/setup.py b/policy_module/setup.py
deleted file mode 100644
index d5c3562..0000000
--- a/policy_module/setup.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright 2018 Whitestack, LLC
-# *************************************************************
-
-# This file is part of OSM Monitoring module
-# All Rights Reserved to Whitestack, LLC
-
-# 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.
-
-# For those usages not covered by the Apache License, Version 2.0 please
-# contact: bdiaz@whitestack.com or glavado@whitestack.com
-##
-import setuptools
-
-
-def parse_requirements(requirements):
-    with open(requirements) as f:
-        return [l.strip('\n') for l in f if l.strip('\n') and not l.startswith('#') and '://' not in l]
-
-
-_author = "Benjamín Díaz"
-_name = 'osm_policy_module'
-_author_email = 'bdiaz@whitestack.com'
-_version = '1.0'
-_description = 'OSM Policy Module'
-_maintainer = 'Benjamín Díaz'
-_maintainer_email = 'bdiaz@whitestack.com'
-_license = 'Apache 2.0'
-_url = 'https://osm.etsi.org/gitweb/?p=osm/MON.git;a=tree'
-
-setuptools.setup(
-    name=_name,
-    version=_version,
-    description=_description,
-    long_description=open('README.rst').read(),
-    author=_author,
-    author_email=_author_email,
-    maintainer=_maintainer,
-    maintainer_email=_maintainer_email,
-    url=_url,
-    license=_license,
-    packages=setuptools.find_packages(),
-    include_package_data=True,
-    install_requires=[
-        'kafka==1.3.*',
-        'peewee==3.1.*',
-        'jsonschema==2.6.*',
-        'six==1.11.*',
-        'pyyaml==3.*',
-        'python-logstash==0.4.*',
-        'osm-common==4.*'
-    ],
-    entry_points={
-        "console_scripts": [
-            "osm-policy-agent = osm_policy_module.cmd.policy_module_agent:main",
-        ]
-    },
-    dependency_links=[
-        'git+https://osm.etsi.org/gerrit/osm/common.git@v4.0.1#egg=osm-common'
-    ]
-)
