diff --git a/installers/charm/pol/src/charm.py b/installers/charm/pol/src/charm.py
new file mode 100755
index 0000000..649e15b
--- /dev/null
+++ b/installers/charm/pol/src/charm.py
@@ -0,0 +1,231 @@
+#!/usr/bin/env python3
+# Copyright 2020 Canonical Ltd.
+#
+# 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: legal@canonical.com
+#
+# To get in touch with the maintainers, please contact:
+# osm-charmers@lists.launchpad.net
+##
+
+import logging
+from pydantic import ValidationError
+from typing import Any, Dict, NoReturn
+
+from ops.charm import CharmBase, CharmEvents
+from ops.framework import EventBase, EventSource, StoredState
+from ops.main import main
+from ops.model import ActiveStatus, BlockedStatus, MaintenanceStatus
+from oci_image import OCIImageResource, OCIImageResourceError
+
+from pod_spec import make_pod_spec
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigurePodEvent(EventBase):
+    """Configure Pod event"""
+
+    pass
+
+
+class PolEvents(CharmEvents):
+    """POL Events"""
+
+    configure_pod = EventSource(ConfigurePodEvent)
+
+
+class PolCharm(CharmBase):
+    """POL Charm."""
+
+    state = StoredState()
+    on = PolEvents()
+
+    def __init__(self, *args) -> NoReturn:
+        """POL Charm constructor."""
+        super().__init__(*args)
+
+        # Internal state initialization
+        self.state.set_default(pod_spec=None)
+
+        # Message bus data initialization
+        self.state.set_default(message_host=None)
+        self.state.set_default(message_port=None)
+
+        # Database data initialization
+        self.state.set_default(database_uri=None)
+
+        self.image = OCIImageResource(self, "image")
+
+        # Registering regular events
+        self.framework.observe(self.on.start, self.configure_pod)
+        self.framework.observe(self.on.config_changed, self.configure_pod)
+        self.framework.observe(self.on.upgrade_charm, self.configure_pod)
+
+        # Registering custom internal events
+        self.framework.observe(self.on.configure_pod, self.configure_pod)
+
+        # Registering required relation events
+        self.framework.observe(
+            self.on.kafka_relation_changed, self._on_kafka_relation_changed
+        )
+        self.framework.observe(
+            self.on.mongodb_relation_changed, self._on_mongodb_relation_changed
+        )
+
+        # Registering required relation departed events
+        self.framework.observe(
+            self.on.kafka_relation_departed, self._on_kafka_relation_departed
+        )
+        self.framework.observe(
+            self.on.mongodb_relation_departed, self._on_mongodb_relation_departed
+        )
+
+    def _on_kafka_relation_changed(self, event: EventBase) -> NoReturn:
+        """Reads information about the kafka relation.
+
+        Args:
+            event (EventBase): Kafka relation event.
+        """
+        data_loc = event.unit if event.unit else event.app
+
+        message_host = event.relation.data[data_loc].get("host")
+        message_port = event.relation.data[data_loc].get("port")
+
+        if (
+            message_host
+            and message_port
+            and (
+                self.state.message_host != message_host
+                or self.state.message_port != message_port
+            )
+        ):
+            self.state.message_host = message_host
+            self.state.message_port = message_port
+            self.on.configure_pod.emit()
+
+    def _on_kafka_relation_departed(self, event: EventBase) -> NoReturn:
+        """Clear kafka relation data.
+
+        Args:
+            event (EventBase): Kafka relation event.
+        """
+        self.state.message_host = None
+        self.state.message_port = None
+        self.on.configure_pod.emit()
+
+    def _on_mongodb_relation_changed(self, event: EventBase) -> NoReturn:
+        """Reads information about the DB relation.
+
+        Args:
+            event (EventBase): DB relation event.
+        """
+        data_loc = event.unit if event.unit else event.app
+
+        database_uri = event.relation.data[data_loc].get("connection_string")
+
+        if database_uri and self.state.database_uri != database_uri:
+            self.state.database_uri = database_uri
+            self.on.configure_pod.emit()
+
+    def _on_mongodb_relation_departed(self, event: EventBase) -> NoReturn:
+        """Clear mongodb relation data.
+
+        Args:
+            event (EventBase): DB relation event.
+        """
+        self.state.database_uri = None
+        self.on.configure_pod.emit()
+
+    def _missing_relations(self) -> str:
+        """Checks if there missing relations.
+
+        Returns:
+            str: string with missing relations
+        """
+        data_status = {
+            "kafka": self.state.message_host,
+            "mongodb": self.state.database_uri,
+        }
+
+        missing_relations = [k for k, v in data_status.items() if not v]
+
+        return ", ".join(missing_relations)
+
+    @property
+    def relation_state(self) -> Dict[str, Any]:
+        """Collects relation state configuration for pod spec assembly.
+
+        Returns:
+            Dict[str, Any]: relation state information.
+        """
+        relation_state = {
+            "message_host": self.state.message_host,
+            "message_port": self.state.message_port,
+            "database_uri": self.state.database_uri,
+        }
+
+        return relation_state
+
+    def configure_pod(self, event: EventBase) -> NoReturn:
+        """Assemble the pod spec and apply it, if possible.
+
+        Args:
+            event (EventBase): Hook or Relation event that started the
+                               function.
+        """
+        if missing := self._missing_relations():
+            self.unit.status = BlockedStatus(
+                "Waiting for {0} relation{1}".format(
+                    missing, "s" if "," in missing else ""
+                )
+            )
+            return
+
+        if not self.unit.is_leader():
+            self.unit.status = ActiveStatus("ready")
+            return
+
+        self.unit.status = MaintenanceStatus("Assembling pod spec")
+
+        # Fetch image information
+        try:
+            self.unit.status = MaintenanceStatus("Fetching image information")
+            image_info = self.image.fetch()
+        except OCIImageResourceError:
+            self.unit.status = BlockedStatus("Error fetching image information")
+            return
+
+        try:
+            pod_spec = make_pod_spec(
+                image_info,
+                self.model.config,
+                self.relation_state,
+                self.model.app.name,
+            )
+        except ValidationError as exc:
+            logger.exception("Config/Relation data validation error")
+            self.unit.status = BlockedStatus(str(exc))
+            return
+
+        if self.state.pod_spec != pod_spec:
+            self.model.pod.set_spec(pod_spec)
+            self.state.pod_spec = pod_spec
+
+        self.unit.status = ActiveStatus("ready")
+
+
+if __name__ == "__main__":
+    main(PolCharm)
diff --git a/installers/charm/pol/src/pod_spec.py b/installers/charm/pol/src/pod_spec.py
new file mode 100644
index 0000000..2caafbd
--- /dev/null
+++ b/installers/charm/pol/src/pod_spec.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python3
+# Copyright 2020 Canonical Ltd.
+#
+# 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: legal@canonical.com
+#
+# To get in touch with the maintainers, please contact:
+# osm-charmers@lists.launchpad.net
+##
+
+import logging
+from pydantic import BaseModel, constr, PositiveInt
+from typing import Any, Dict, List
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigData(BaseModel):
+    """Configuration data model."""
+
+    log_level: constr(regex=r"^(INFO|DEBUG)$")
+
+
+class RelationData(BaseModel):
+    """Relation data model."""
+
+    message_host: constr(min_length=1)
+    message_port: PositiveInt
+    database_uri: constr(regex=r"^(mongodb://)")
+
+
+def _make_pod_ports(port: int) -> List[Dict[str, Any]]:
+    """Generate pod ports details.
+
+    Args:
+        port (int): port to expose.
+
+    Returns:
+        List[Dict[str, Any]]: pod port details.
+    """
+    return [{"name": "pol", "containerPort": port, "protocol": "TCP"}]
+
+
+def _make_pod_envconfig(
+    config: Dict[str, Any], relation_state: Dict[str, Any]
+) -> Dict[str, Any]:
+    """Generate pod environment configuration.
+
+    Args:
+        config (Dict[str, Any]): configuration information.
+        relation_state (Dict[str, Any]): relation state information.
+
+    Returns:
+        Dict[str, Any]: pod environment configuration.
+    """
+    envconfig = {
+        # General configuration
+        "ALLOW_ANONYMOUS_LOGIN": "yes",
+        "OSMPOL_GLOBAL_LOGLEVEL": config["log_level"],
+        # Kafka configuration
+        "OSMPOL_MESSAGE_HOST": relation_state["message_host"],
+        "OSMPOL_MESSAGE_DRIVER": "kafka",
+        "OSMPOL_MESSAGE_PORT": relation_state["message_port"],
+        # Database configuration
+        "OSMPOL_DATABASE_DRIVER": "mongo",
+        "OSMPOL_DATABASE_URI": relation_state["database_uri"],
+    }
+
+    return envconfig
+
+
+def _make_startup_probe() -> Dict[str, Any]:
+    """Generate startup probe.
+
+    Returns:
+        Dict[str, Any]: startup probe.
+    """
+    return {
+        "exec": {"command": ["/usr/bin/pgrep", "python3"]},
+        "initialDelaySeconds": 60,
+        "timeoutSeconds": 5,
+    }
+
+
+def _make_readiness_probe() -> Dict[str, Any]:
+    """Generate readiness probe.
+
+    Returns:
+        Dict[str, Any]: readiness probe.
+    """
+    return {
+        "exec": {
+            "command": ["sh", "-c", "osm-pol-healthcheck || exit 1"],
+        },
+        "periodSeconds": 10,
+        "timeoutSeconds": 5,
+        "successThreshold": 1,
+        "failureThreshold": 3,
+    }
+
+
+def _make_liveness_probe() -> Dict[str, Any]:
+    """Generate liveness probe.
+
+    Returns:
+        Dict[str, Any]: liveness probe.
+    """
+    return {
+        "exec": {
+            "command": ["sh", "-c", "osm-pol-healthcheck || exit 1"],
+        },
+        "initialDelaySeconds": 45,
+        "periodSeconds": 10,
+        "timeoutSeconds": 5,
+        "successThreshold": 1,
+        "failureThreshold": 3,
+    }
+
+
+def make_pod_spec(
+    image_info: Dict[str, str],
+    config: Dict[str, Any],
+    relation_state: Dict[str, Any],
+    app_name: str = "pol",
+    port: int = 80,
+) -> Dict[str, Any]:
+    """Generate the pod spec information.
+
+    Args:
+        image_info (Dict[str, str]): Object provided by
+                                     OCIImageResource("image").fetch().
+        config (Dict[str, Any]): Configuration information.
+        relation_state (Dict[str, Any]): Relation state information.
+        app_name (str, optional): Application name. Defaults to "pol".
+        port (int, optional): Port for the container. Defaults to 80.
+
+    Returns:
+        Dict[str, Any]: Pod spec dictionary for the charm.
+    """
+    if not image_info:
+        return None
+
+    ConfigData(**(config))
+    RelationData(**(relation_state))
+
+    ports = _make_pod_ports(port)
+    env_config = _make_pod_envconfig(config, relation_state)
+
+    return {
+        "version": 3,
+        "containers": [
+            {
+                "name": app_name,
+                "imageDetails": image_info,
+                "imagePullPolicy": "Always",
+                "ports": ports,
+                "envConfig": env_config,
+            }
+        ],
+        "kubernetesResources": {
+            "ingressResources": [],
+        },
+    }
