diff --git a/osm_mon/cmd/mon_collector.py b/osm_mon/cmd/mon_collector.py
new file mode 100644
index 0000000..30e6676
--- /dev/null
+++ b/osm_mon/cmd/mon_collector.py
@@ -0,0 +1,65 @@
+# -*- 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
+
+from osm_mon.collector.collector import Collector
+from osm_mon.core.config import Config
+from osm_mon.cmd.mon_utils import wait_till_core_services_are_ready
+
+
+def main():
+    parser = argparse.ArgumentParser(prog="osm-mon-collector")
+    parser.add_argument("--config-file", nargs="?", help="MON configuration file")
+    args = parser.parse_args()
+    cfg = Config(args.config_file)
+
+    root = logging.getLogger()
+    root.setLevel(logging.getLevelName(cfg.get("global", "loglevel")))
+    ch = logging.StreamHandler(sys.stdout)
+    ch.setLevel(logging.getLevelName(cfg.get("global", "loglevel")))
+    formatter = logging.Formatter(
+        "%(asctime)s - %(name)s - %(levelname)s - %(message)s", "%m/%d/%Y %I:%M:%S %p"
+    )
+    ch.setFormatter(formatter)
+    root.addHandler(ch)
+
+    log = logging.getLogger(__name__)
+    if wait_till_core_services_are_ready(cfg, "osm-mon-collector"):
+        log.info("Starting MON Collector...")
+        log.debug("Config: %s", cfg.conf)
+        log.info("Initializing database...")
+        try:
+            collector = Collector(cfg)
+            collector.collect_forever()
+        except Exception as e:
+            log.error("Failed to start MON Collector")
+            log.exception("Exception: %s", str(e))
+    else:
+        log.error("Failed to start MON Collector")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/osm_mon/cmd/mon_evaluator.py b/osm_mon/cmd/mon_evaluator.py
new file mode 100644
index 0000000..b1c0e2a
--- /dev/null
+++ b/osm_mon/cmd/mon_evaluator.py
@@ -0,0 +1,65 @@
+# -*- 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
+
+from osm_mon.core.config import Config
+from osm_mon.evaluator.evaluator import Evaluator
+from osm_mon.cmd.mon_utils import wait_till_core_services_are_ready
+
+
+def main():
+    parser = argparse.ArgumentParser(prog="osm-mon-evaluator")
+    parser.add_argument("--config-file", nargs="?", help="MON configuration file")
+    args = parser.parse_args()
+    cfg = Config(args.config_file)
+
+    root = logging.getLogger()
+    root.setLevel(logging.getLevelName(cfg.get("global", "loglevel")))
+    ch = logging.StreamHandler(sys.stdout)
+    ch.setLevel(logging.getLevelName(cfg.get("global", "loglevel")))
+    formatter = logging.Formatter(
+        "%(asctime)s - %(name)s - %(levelname)s - %(message)s", "%m/%d/%Y %I:%M:%S %p"
+    )
+    ch.setFormatter(formatter)
+    root.addHandler(ch)
+
+    log = logging.getLogger(__name__)
+    if wait_till_core_services_are_ready(cfg, "osm-mon-evaluator"):
+        log.info("Starting MON Evaluator...")
+        log.debug("Config: %s", cfg.conf)
+        log.info("Initializing database...")
+        try:
+            evaluator = Evaluator(cfg)
+            evaluator.evaluate_forever()
+        except Exception as e:
+            log.error("Failed to start MON Evaluator")
+            log.exception("Exception: %s", str(e))
+    else:
+        log.error("Failed to start MON Evaluator")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/osm_mon/cmd/mon_healthcheck.py b/osm_mon/cmd/mon_healthcheck.py
new file mode 100644
index 0000000..7eae4c2
--- /dev/null
+++ b/osm_mon/cmd/mon_healthcheck.py
@@ -0,0 +1,73 @@
+# 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 subprocess
+import sys
+
+import requests
+
+log = logging.getLogger(__name__)
+
+
+def main():
+    parser = argparse.ArgumentParser(prog="osm-mon-healthcheck")
+    parser.add_argument("--config-file", nargs="?", help="MON configuration file")
+    # args = parser.parse_args()
+    # cfg = Config(args.config_file)
+
+    if not _processes_running():
+        sys.exit(1)
+    if not _is_prometheus_exporter_ok():
+        sys.exit(1)
+    sys.exit(0)
+
+
+def _processes_running():
+    def _contains_process(processes, process_name):
+        for row in processes:
+            if process_name in row:
+                return True
+        return False
+
+    processes_to_check = ["osm-mon-collector", "osm-mon-evaluator", "osm-mon-server"]
+    ps = subprocess.Popen(["ps", "aux"], stdout=subprocess.PIPE).communicate()[0]
+    processes_running = ps.decode().split("\n")
+    for p in processes_to_check:
+        if not _contains_process(processes_running, p):
+            log.error("Process %s not running!" % p)
+            return False
+    return True
+
+
+def _is_prometheus_exporter_ok():
+    try:
+        r = requests.get("http://localhost:8000")
+        r.raise_for_status()
+        return True
+    except Exception:
+        log.exception("MON Prometheus exporter is not running")
+        return False
+
+
+if __name__ == "__main__":
+    main()
diff --git a/osm_mon/cmd/mon_server.py b/osm_mon/cmd/mon_server.py
new file mode 100644
index 0000000..c4fa08b
--- /dev/null
+++ b/osm_mon/cmd/mon_server.py
@@ -0,0 +1,65 @@
+# -*- 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
+
+from osm_mon.core.config import Config
+from osm_mon.server.server import Server
+from osm_mon.cmd.mon_utils import wait_till_core_services_are_ready
+
+
+def main():
+    parser = argparse.ArgumentParser(prog="osm-mon-server")
+    parser.add_argument("--config-file", nargs="?", help="MON configuration file")
+    args = parser.parse_args()
+    cfg = Config(args.config_file)
+
+    root = logging.getLogger()
+    root.setLevel(logging.getLevelName(cfg.get("global", "loglevel")))
+    ch = logging.StreamHandler(sys.stdout)
+    ch.setLevel(logging.getLevelName(cfg.get("global", "loglevel")))
+    formatter = logging.Formatter(
+        "%(asctime)s - %(name)s - %(levelname)s - %(message)s", "%m/%d/%Y %I:%M:%S %p"
+    )
+    ch.setFormatter(formatter)
+    root.addHandler(ch)
+
+    log = logging.getLogger(__name__)
+    if wait_till_core_services_are_ready(cfg, "osm-mon-server"):
+        log.info("Starting MON Server...")
+        log.debug("Config: %s", cfg.conf)
+        log.info("Initializing database...")
+        try:
+            server = Server(cfg)
+            server.run()
+        except Exception as e:
+            log.error("Failed to start MON Server")
+            log.exception("Exception: %s", str(e))
+    else:
+        log.error("Failed to start MON Server")
+
+
+if __name__ == "__main__":
+    main()
