diff --git a/.gitignore b/.gitignore
index b80d7e8..7c7deb8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,8 +2,4 @@
 *.swp
 *.pyc
 .ropeproject
-tests/lua/mocks/inspect.lua
-tests/lua/mocks/anomaly.lua
-tests/lua/mocks/annotation.lua
-tests/lua/mocks/date_time.lua
-tests/circular_buffer.so
+
diff --git a/README.rst b/README.rst
index 75e0ed0..90730cd 100644
--- a/README.rst
+++ b/README.rst
@@ -3,33 +3,98 @@
 Heka Formula
 ============
 
-Heka is an open source stream processing software system developed by Mozilla. Heka is a Swiss Army Knife type tool for data processing.
+Heka is an open source stream processing software system developed by Mozilla. Heka is a Swiss Army Knife type tool for data processing
 
 Sample pillars
 ==============
 
-Log collector service
+Basic log shipper streaming decoded rsyslog's logfiles using amqp broker as transport.
+From every message there is one amqp message and it's also logged to  heka's logfile in RST format.
 
 .. code-block:: yaml
 
+
     heka:
-      log_collector:
+      server:
         enabled: true
+        input:
+          rsyslog-syslog:
+            engine: logstreamer
+            log_directory: /var/log
+            file_match: syslog\.?(?P<Index>\d+)?(.gz)?
+            decoder: RsyslogDecoder
+            priority: ["^Index"]
+          rsyslog-auth:
+            engine: logstreamer
+            log_directory: /var/log
+            file_match: auth\.log\.?(?P<Index>\d+)?(.gz)?
+            decoder: RsyslogDecoder
+            priority: ["^Index"]
+        decoder:
+          rsyslog:
+            engine: rsyslog
+            template: %TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n
+            hostname_keep: TRUE
+            tz: Europe/Prague
         output:
-          elasticsearch01:
-            engine: elasticsearch
+          rabbitmq:
+            engine: amqp
             host: localhost
-            port: 9200
-            encoder: es_json
+            user: guest
+            password: guest
+            vhost: /logs
+            exchange: logs
+            exchange_type: fanout
+            encoder: ProtobufEncoder
+            use_framing: true
+          heka-logfile:
+            engine: logoutput
+            encoder: RstEncoder
             message_matcher: TRUE
+        encoder:
+          heka-logfile:
+            engine: RstEncoder
 
-Metric collector service
+
+Heka acting as message router and dashboard.
+Messages are consumed from amqp and sent to elasticsearch server.
+
 
 .. code-block:: yaml
 
+
     heka:
-      metric_collector:
+      server:
         enabled: true
+        input:
+          rabbitmq:
+            engine: amqp
+            host: localhost
+            user: guest
+            password: guest
+            vhost: /logs
+            exchange: logs
+            exchange_type: fanout
+            decoder: ProtoBufDecoder
+            splitter: HekaFramingSplitter
+          rsyslog-syslog:
+            engine: logstreamer
+            log_directory: /var/log
+            file_match: syslog\.?(?P<Index>\d+)?(.gz)?
+            decoder: RsyslogDecoder
+            priority: ["^Index"]
+          rsyslog-auth:
+            engine: logstreamer
+            log_directory: /var/log
+            file_match: auth\.log\.?(?P<Index>\d+)?(.gz)?
+            decoder: RsyslogDecoder
+            priority: ["^Index"]
+        decoder:
+          rsyslog:
+            engine: rsyslog
+            template: %TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n
+            hostname_keep: TRUE
+            tz: Europe/Prague
         output:
           elasticsearch01:
             engine: elasticsearch
@@ -40,25 +105,11 @@
           dashboard01:
             engine: dashboard
             ticker_interval: 30
-
-Aggregator service
-
-.. code-block:: yaml
-
-    heka:
-      aggregator:
-        enabled: true
-        output:
-          elasticsearch01:
-            engine: elasticsearch
-            host: localhost
-            port: 9200
-            encoder: es_json
+        encoder:
+          es-json:
+            engine: es-json
             message_matcher: TRUE
-          dashboard01:
-            engine: dashboard
-            ticker_interval: 30
-
+            index: logfile-%{%Y.%m.%d}
 
 Read more
 =========
diff --git a/_modules/heka_alarming.py b/_modules/heka_alarming.py
deleted file mode 100644
index 8f86efd..0000000
--- a/_modules/heka_alarming.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import re
-
-_valid_dimension_re = re.compile(r'^[a-z0-9_/-]+$')
-_disallowed_dimensions = ('name', 'value', 'hostname', 'member',
-                          'no_alerting', 'tag_fields')
-
-
-def alarm_message_matcher(alarm, triggers):
-    """
-    Return an Heka message matcher expression for a given alarm and a
-    dict of triggers.
-
-    For example the function may return this:
-
-        Fields[name] == 'cpu_idle' || Fields[name] = 'cpu_wait'
-    """
-    matchers = set()
-    for trigger_name in alarm.get('triggers', []):
-        trigger = triggers.get(trigger_name)
-        if trigger and trigger.get('enabled', True):
-            for rule in trigger.get('rules', []):
-                matcher = "Fields[name] == '{}'".format(rule['metric'])
-                matchers.add(matcher)
-    return ' || '.join(matchers)
-
-
-def alarm_activate_alerting(alerting):
-    return ('true' if alerting in ['enabled', 'enabled_with_notification']
-            else 'false')
-
-
-def alarm_enable_notification(alerting):
-    return 'true' if alerting == 'enabled_with_notification' else 'false'
-
-
-def alarm_cluster_message_matcher(alarm_cluster):
-    """
-    Return an Heka message matcher expression for a given alarm cluster.
-
-    For example the function may return this:
-
-        Fields[service] == 'rabbitmq-cluster'
-    """
-    matchers = set()
-    match_items = alarm_cluster.get('match', {}).items()
-    for match_name, match_value in match_items:
-        matcher = "Fields[{}] == '{}'".format(match_name, match_value)
-        matchers.add(matcher)
-    match_items = alarm_cluster.get('match_re', {}).items()
-    for match_name, match_value in match_items:
-        matcher = "Fields[{}] =~ /{}/".format(match_name, match_value)
-        matchers.add(matcher)
-    return ' && '.join(matchers)
-
-
-def dimensions(alarm_or_alarm_cluster):
-    """
-    Return a dict alarm dimensions. Each dimension is validated, and an
-    Exception is raised if a dimension is invalid.
-
-    Valid characters are a-z, 0-9, _, - and /.
-    """
-    dimensions = alarm_or_alarm_cluster.get('dimension', {})
-    for name, value in dimensions.items():
-        if name in _disallowed_dimensions:
-            raise Exception(
-                '{} is not allowed as a dimension name'.format(name))
-        if not _valid_dimension_re.match(name):
-            raise Exception(
-                'Dimension name {} includes disallowed chars'.format(name))
-        if not _valid_dimension_re.match(value):
-            raise Exception(
-                'Dimension value {} includes disallowed chars'.format(value))
-    return dimensions
-
-
-def grains_for_mine(grains):
-    """
-    Return grains that need to be sent to Salt Mine. Only the alarm
-    and alarm cluster data is to be sent to Mine.
-    """
-    filtered_grains = {}
-    for service_name, service_data in grains.items():
-        alarm = service_data.get('alarm')
-        if alarm:
-            filtered_grains[service_name] = {'alarm': alarm}
-        trigger = service_data.get('trigger')
-        if trigger:
-            if service_name in filtered_grains:
-                filtered_grains[service_name].update(
-                    {'trigger': trigger})
-            else:
-                filtered_grains[service_name] = {'trigger': trigger}
-        alarm_cluster = service_data.get('alarm_cluster')
-        if alarm_cluster:
-            if service_name in filtered_grains:
-                filtered_grains[service_name].update(
-                    {'alarm_cluster': alarm_cluster})
-            else:
-                filtered_grains[service_name] = \
-                    {'alarm_cluster': alarm_cluster}
-    return filtered_grains
diff --git a/debian/changelog b/debian/changelog
index b604c53..f828603 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,5 @@
-
+<<<<<<< HEAD
+=======
 salt-formula-heka (0.2) trusty; urgency=medium
 
   * First public release
diff --git a/heka/_common.sls b/heka/_common.sls
deleted file mode 100644
index 1753840..0000000
--- a/heka/_common.sls
+++ /dev/null
@@ -1,46 +0,0 @@
-{%- from "heka/map.jinja" import server with context %}
-
-heka_packages:
-  pkg.latest:
-  - names: {{ server.pkgs }}
-
-/usr/share/lma_collector:
-  file.recurse:
-  - source: salt://heka/files/lua
-
-/usr/share/lma_collector/common/extra_fields.lua:
-  file.managed:
-  - source: salt://heka/files/extra_fields.lua
-  - user: root
-  - mode: 644
-  - defaults:
-      extra_fields: {{ server.extra_fields }}
-  - template: jinja
-
-heka_user:
-  user.present:
-  - name: heka
-  - system: true
-  - shell: /bin/false
-  - groups: {{ server.groups }}
-  - require:
-    - pkg: heka_packages
-
-heka_acl_log:
-  cmd.run:
-  - name: "setfacl -R -m g:adm:rx /var/log; setfacl -R -d -m g:adm:rx /var/log"
-  - unless: "getfacl /var/log/|grep default:group:adm"
-
-hekad_process:
-  process.absent:
-  - name: 'hekad -config=/etc/heka'
-
-/etc/init.d/heka:
-  file.absent
-
-heka_grains_dir:
-  file.directory:
-  - name: /etc/salt/grains.d
-  - mode: 700
-  - makedirs: true
-  - user: root
diff --git a/heka/_service.sls b/heka/_service.sls
deleted file mode 100644
index d098575..0000000
--- a/heka/_service.sls
+++ /dev/null
@@ -1,393 +0,0 @@
-{%- macro load_grains_file(grains_fragment_file) %}{% include grains_fragment_file ignore missing %}{% endmacro %}
-
-{%- if server.enabled is defined and server.enabled %}
-
-heka_{{ service_name }}_log_file:
-  file.managed:
-  - name: /var/log/{{ service_name }}.log
-  - user: heka
-  - mode: 644
-  - replace: false
-
-heka_{{ service_name }}_conf_dir:
-  file.directory:
-  - name: /etc/{{ service_name }}
-  - user: heka
-  - mode: 750
-  - makedirs: true
-
-heka_{{ service_name }}_cache_dir:
-  file.directory:
-  - name: /var/cache/{{ service_name }}
-  - user: heka
-  - mode: 750
-  - makedirs: true
-
-heka_{{ service_name }}_conf_dir_clean:
-  file.directory:
-  - name: /etc/{{ service_name }}
-  - clean: true
-
-{%- if grains.get('init', None) == 'systemd' %}
-{%- set systemd_enabled = True %}
-{%- else %}
-{%- set systemd_enabled = False %}
-{%- endif %}
-
-heka_{{ service_name }}_service_file:
-  file.managed:
-{%- if systemd_enabled %}
-  - name: /etc/systemd/system/{{ service_name }}.service
-{%- else %}
-  - name: /etc/init/{{ service_name }}.conf
-{%- endif %}
-  - source: salt://heka/files/heka.service
-  - user: root
-  - mode: 644
-  - defaults:
-    service_name: {{ service_name }}
-    systemd_enabled: {{ systemd_enabled|lower }}
-    max_open_files: 102400
-    automatic_starting: {{ server.automatic_starting }}
-  - template: jinja
-
-{%- if not systemd_enabled %}
-
-heka_{{ service_name }}_service_wrapper:
-  file.managed:
-  - name: /usr/local/bin/{{ service_name }}_wrapper
-  - source: salt://heka/files/service_wrapper
-  - user: root
-  - mode: 755
-  - defaults:
-    service_name: {{ service_name }}
-  - template: jinja
-
-{%- endif %}
-
-heka_{{ service_name }}_service:
-{%- if server.automatic_starting %}
-  service.running:
-  - enable: True
-  - watch:
-    - file: /usr/share/lma_collector/*
-    - file: /etc/{{ service_name }}/*
-{%- else %}
-  service.disabled:
-{%- endif %}
-  - name: {{ service_name }}
-
-{# Setup basic structure for all roles so updates can apply #}
-
-{%- set service_grains = {
-  'log_collector': {
-    'decoder': {},
-    'input': {},
-    'trigger': {},
-    'filter': {},
-    'splitter': {},
-    'encoder': {},
-    'output': {},
-  },
-  'metric_collector': {
-    'decoder': {},
-    'input': {},
-    'trigger': {},
-    'alarm': {},
-    'filter': {},
-    'splitter': {},
-    'encoder': {},
-    'output': {},
-  },
-  'remote_collector': {
-    'decoder': {},
-    'input': {},
-    'trigger': {},
-    'alarm': {},
-    'filter': {},
-    'splitter': {},
-    'encoder': {},
-    'output': {},
-  },
-  'aggregator': {
-    'decoder': {},
-    'input': {},
-    'trigger': {},
-    'alarm_cluster': {},
-    'filter': {},
-    'splitter': {},
-    'encoder': {},
-    'output': {},
-  },
-  'ceilometer_collector': {
-    'decoder': {},
-    'input': {},
-    'filter': {},
-    'splitter': {},
-    'encoder': {},
-    'output': {},
-  }
-} %}
-
-
-
-{# Loading the other services' support metadata for local roles #}
-
-{%- for service_name, service in pillar.iteritems() %}
-{%- if service.get('_support', {}).get('heka', {}).get('enabled', False) %}
-
-{%- set grains_fragment_file = service_name+'/meta/heka.yml' %}
-{%- set grains_yaml = load_grains_file(grains_fragment_file)|load_yaml %}
-{%- set service_grains = salt['grains.filter_by']({'default': service_grains}, merge=grains_yaml) %}
-
-{%- endif %}
-{%- endfor %}
-
-{%- if service_name in ('remote_collector', 'aggregator') %}
-
-{# Load the other services' support metadata from salt-mine #}
-
-{%- for node_name, node_grains in salt['mine.get']('*', 'grains.items').iteritems() %}
-{%- if node_grains.heka is defined %}
-{% for service, data in node_grains.heka.items() %}
-  {%- if service in ('remote_collector', 'aggregator') %}
-    {%- do salt['grains.filter_by']({'default': service_grains[service]}, merge=data) %}
-  {%- endif %}
-{% endfor %}
-{% endif %}
-{%- endfor %}
-
-{%- endif %}
-
-
-{# Overriding aggregated metadata from user-space pillar data #}
-
-{%- for service_grain_name, service_grain in service_grains.iteritems() %}
-{% if salt['pillar.get']('heka:'+service_grain_name) %}
-
-{%- for service_action_name, service_action in service_grain.iteritems() %}
-{%- if salt['pillar.get']('heka:'+service_grain_name).get(service_action_name, None) is mapping %}
-
-{%- set grain_action_meta = salt['pillar.get']('heka:'+service_grain_name+':'+service_action_name) %}
-{%- do service_grains.get(service_grain_name).get(service_action_name).update(grain_action_meta) %}
-
-{%- endif %}
-{%- endfor %}
-
-{%- endif %}
-{%- endfor %}
-
-heka_{{ service_name }}_grain:
-  file.managed:
-  - name: /etc/salt/grains.d/heka
-  - source: salt://heka/files/heka.grain
-  - template: jinja
-  - user: root
-  - mode: 600
-  - defaults:
-    service_grains:
-      heka: {{ salt['heka_alarming.grains_for_mine'](service_grains)|yaml }}
-  - require:
-    - file: heka_grains_dir
-
-/etc/{{ service_name }}/global.toml:
-  file.managed:
-  - source: salt://heka/files/toml/global.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - defaults:
-    service_name: {{ service_name }}
-    poolsize: {{ server.poolsize }}
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-
-{%- set service_metadata = service_grains.get(service_name) %}
-
-{%- for decoder_name, decoder in service_metadata.get('decoder', {}).iteritems() %}
-
-/etc/{{ service_name }}/decoder_{{ decoder_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/decoder/{{ decoder.engine }}.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      decoder_name: {{ decoder_name }}
-      decoder: {{ decoder|yaml }}
-
-{%- endfor %}
-
-{%- for input_name, input in service_metadata.get('input', {}).iteritems() %}
-
-/etc/{{ service_name }}/input_{{ input_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/input/{{ input.engine }}.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      input_name: {{ input_name }}
-      input: {{ input|yaml }}
-
-{%- endfor %}
-
-{%- for alarm_name, alarm in service_metadata.get('alarm', {}).iteritems() %}
-
-/etc/{{ service_name }}/filter_afd_{{ alarm_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/filter/afd_alarm.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      alarm_name: {{ alarm_name }}
-      alarm: {{ alarm|yaml }}
-      trigger: {{ service_metadata.get('trigger', {})|yaml }}
-
-/usr/share/lma_collector/common/lma_{{ alarm_name|replace('-', '_') }}.lua:
-  file.managed:
-  - source: salt://heka/files/lma_alarm.lua
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: /usr/share/lma_collector
-  - defaults:
-      alarm_name: {{ alarm_name }}
-      alarm: {{ alarm|yaml }}
-      trigger: {{ service_metadata.get('trigger', {})|yaml }}
-
-{%- endfor %}
-
-{%- set policy = service_metadata.get('policy') %}
-{%- if policy %}
-/usr/share/lma_collector/common/gse_policies.lua:
-  file.managed:
-  - source: salt://heka/files/gse_policies.lua
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: /usr/share/lma_collector
-  - defaults:
-    policy: {{ policy|yaml }}
-{%- endif %}
-
-{%- for alarm_cluster_name, alarm_cluster in service_metadata.get('alarm_cluster', {}).iteritems() %}
-
-/etc/{{ service_name }}/filter_gse_{{ alarm_cluster_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/filter/gse_alarm_cluster.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      alarm_cluster_name: {{ alarm_cluster_name }}
-      alarm_cluster: {{ alarm_cluster|yaml }}
-
-/usr/share/lma_collector/common/gse_{{ alarm_cluster_name|replace('-', '_') }}_topology.lua:
-  file.managed:
-  - source: salt://heka/files/gse_topology.lua
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: /usr/share/lma_collector
-  - defaults:
-      alarm_cluster_name: {{ alarm_cluster_name }}
-      alarm_cluster: {{ alarm_cluster|yaml }}
-
-{%- endfor %}
-
-{%- for filter_name, filter in service_metadata.get('filter', {}).iteritems() %}
-
-/etc/{{ service_name }}/filter_{{ filter_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/filter/{{ filter.engine }}.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      filter_name: {{ filter_name }}
-      filter: {{ filter|yaml }}
-
-{%- endfor %}
-
-{%- for splitter_name, splitter in service_metadata.get('splitter', {}).iteritems() %}
-
-/etc/{{ service_name }}/splitter_{{ splitter_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/splitter/{{ splitter.engine }}.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      splitter_name: {{ splitter_name }}
-      splitter: {{ splitter|yaml }}
-
-{%- endfor %}
-
-{%- for encoder_name, encoder in service_metadata.get('encoder', {}).iteritems() %}
-
-/etc/{{ service_name }}/encoder_{{ encoder_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/encoder/{{ encoder.engine }}.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      encoder_name: {{ encoder_name }}
-      encoder: {{ encoder|yaml }}
-
-{%- endfor %}
-
-{%- for output_name, output in service_metadata.get('output', {}).iteritems() %}
-
-/etc/{{ service_name }}/output_{{ output_name }}.toml:
-  file.managed:
-  - source: salt://heka/files/toml/output/{{ output.engine }}.toml
-  - template: jinja
-  - mode: 640
-  - group: heka
-  - require:
-    - file: heka_{{ service_name }}_conf_dir
-  - require_in:
-    - file: heka_{{ service_name }}_conf_dir_clean
-  - defaults:
-      output_name: {{ output_name }}
-      output: {{ output|yaml }}
-
-{%- endfor %}
-
-{%- endif %}
diff --git a/heka/aggregator.sls b/heka/aggregator.sls
deleted file mode 100644
index dda138c..0000000
--- a/heka/aggregator.sls
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- if pillar.heka.aggregator is defined %}
-
-include:
-- heka._common
-
-{%- from "heka/map.jinja" import aggregator with context %}
-{%- set server = aggregator %}
-{%- set service_name = "aggregator" %}
-
-{%- include "heka/_service.sls" %}
-
-{%- endif %}
diff --git a/heka/ceilometer_collector.sls b/heka/ceilometer_collector.sls
deleted file mode 100644
index fa05d77..0000000
--- a/heka/ceilometer_collector.sls
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- if pillar.heka.ceilometer_collector is defined %}
-
-include:
-- heka._common
-
-{%- from "heka/map.jinja" import ceilometer_collector with context %}
-{%- set server = ceilometer_collector %}
-{%- set service_name = "ceilometer_collector" %}
-
-{%- include "heka/_service.sls" %}
-
-{%- endif %}
diff --git a/heka/files/00-hekad.toml b/heka/files/00-hekad.toml
new file mode 100644
index 0000000..99cad61
--- /dev/null
+++ b/heka/files/00-hekad.toml
@@ -0,0 +1,3 @@
+[hekad]
+{%- set workers = grains.num_cpus + 1 %}
+maxprocs = {{ workers }}
diff --git a/heka/files/decoder/multidecoder.toml b/heka/files/decoder/multidecoder.toml
new file mode 100644
index 0000000..fe73218
--- /dev/null
+++ b/heka/files/decoder/multidecoder.toml
@@ -0,0 +1,6 @@
+[multidecoder_{{ name }}]
+type = "MultiDecoder"
+subs = {{ values.subs }}
+cascade_strategy = "{{ values.cascade_strategy }}"
+log_sub_errors = {{ values.log_sub_errors }}
+
diff --git a/heka/files/decoder/payloadregex.toml b/heka/files/decoder/payloadregex.toml
new file mode 100644
index 0000000..0af80f7
--- /dev/null
+++ b/heka/files/decoder/payloadregex.toml
@@ -0,0 +1,5 @@
+[Payloadregex_{{ name }}]
+type = "PayloadRegexDecoder"
+match_regex = "{{ values.match_regex }}"
+timestamp_layout = "{{ values.timestamp_layout }}"
+
diff --git a/heka/files/decoder/protobuf.toml b/heka/files/decoder/protobuf.toml
new file mode 100644
index 0000000..c856239
--- /dev/null
+++ b/heka/files/decoder/protobuf.toml
@@ -0,0 +1,3 @@
+[ProtoBufDecoder]
+type = "ProtobufDecoder"
+
diff --git a/heka/files/decoder/rsyslog.toml b/heka/files/decoder/rsyslog.toml
new file mode 100644
index 0000000..6abd40e
--- /dev/null
+++ b/heka/files/decoder/rsyslog.toml
@@ -0,0 +1,9 @@
+{%- from "heka/map.jinja" import server with context -%}
+[RsyslogDecoder]
+type = "SandboxDecoder"
+filename = "lua_decoders/rsyslog.lua"
+
+[RsyslogDecoder.config]
+type = "{{ values.type }}"
+template = '%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n'
+tz = "{{ server.decoder.rsyslog.tz }}"
diff --git a/heka/files/decoder/sandbox.toml b/heka/files/decoder/sandbox.toml
new file mode 100644
index 0000000..053b475
--- /dev/null
+++ b/heka/files/decoder/sandbox.toml
@@ -0,0 +1,30 @@
+[Sandbox_{{ name }}]
+type = "SandboxDecoder"
+filename = "{{ values.file_name }}"
+
+{% if values.module_directory is defined %}
+module_directory =  "{{ values.module_directory }}"
+{%- endif %}
+
+{% if values.memory_limit is defined %}
+memory_limit = "{{ values.memory_limit }}"
+{%- endif %}
+
+{% if values.preserve_data is defined %}
+preserve_data = "{{ values.preserve_data }}"
+{%- endif %}
+
+{% if values.instruction_limit is defined %}
+instruction_limit = "{{ values.instruction_limit }}"
+{%- endif %}
+
+{% if values.output_limit is defined %}
+output_limit = "{{ values.output_limit }}"
+{%- endif %}
+
+{% if values.config is defined %}
+config = [
+{% for k,v in values.config.iteritems() %}
+{{ k }} = {{ v }} ]
+{%- endfor %}
+{%- endif %}
diff --git a/heka/files/toml/encoder/rst.toml b/heka/files/encoder/RstEncoder.toml
similarity index 100%
rename from heka/files/toml/encoder/rst.toml
rename to heka/files/encoder/RstEncoder.toml
diff --git a/heka/files/encoder/es-json.toml b/heka/files/encoder/es-json.toml
new file mode 100644
index 0000000..ae9e0da
--- /dev/null
+++ b/heka/files/encoder/es-json.toml
@@ -0,0 +1,5 @@
+[es_json]
+type = "ESJsonEncoder"
+es_index_from_timestamp = true
+index = "{{ values.get('index', '%{Type}-%{%Y.%m.%d}') }}"
+type_name = "{% raw %}%{Type}{% endraw %}"
diff --git a/heka/files/encoder/es-payload.toml b/heka/files/encoder/es-payload.toml
new file mode 100644
index 0000000..315ab13
--- /dev/null
+++ b/heka/files/encoder/es-payload.toml
@@ -0,0 +1,8 @@
+[es_payload]
+type = "SandboxEncoder"
+filename = "lua_encoders/es_payload.lua"
+
+    [es_payload.config]
+    es_index_from_timestamp = true
+    index = "{{ values.get('index', '%{Logger}-%{%Y.%m.%d}') }}"
+    type_name = "{% raw %}%{Type}-%{Hostname}{% endraw %}"
diff --git a/heka/files/toml/encoder/protobuf.toml b/heka/files/encoder/protobuf.toml
similarity index 94%
rename from heka/files/toml/encoder/protobuf.toml
rename to heka/files/encoder/protobuf.toml
index 5d6d675..b16fc08 100644
--- a/heka/files/toml/encoder/protobuf.toml
+++ b/heka/files/encoder/protobuf.toml
@@ -1 +1,2 @@
 [ProtobufEncoder]
+
diff --git a/heka/files/extra_fields.lua b/heka/files/extra_fields.lua
deleted file mode 100644
index e56d509..0000000
--- a/heka/files/extra_fields.lua
+++ /dev/null
@@ -1,24 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
--- list of fields that are added to Heka messages by the collector
-tags = {
-{%- for key, value in extra_fields.iteritems() %}
-  ['{{ key | replace ("'", "\\'") }}'] = '{{ value | replace ("'", "\\'") }}',
-{%- endfor %}
-}
-
-return M
diff --git a/heka/files/gse_policies.lua b/heka/files/gse_policies.lua
deleted file mode 100644
index 8de8175..0000000
--- a/heka/files/gse_policies.lua
+++ /dev/null
@@ -1,57 +0,0 @@
--- Copyright 2015-2016 Mirantis, Inc.
---
--- 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.
-
-local gse_policy = require 'gse_policy'
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-local policies = {
-{%- for _policy_name, _policy in policy|dictsort %}
-    ['{{ _policy_name|replace("'", "\\'") }}'] = {
-    {%- for _policy_rule in _policy %}
-        gse_policy.new({
-            status = '{{ _policy_rule["status"] }}',
-        {%- set _trigger = _policy_rule.get("trigger") %}
-        {%- if _trigger %}
-            trigger = {
-                logical_operator = '{{ _trigger["logical_operator"] }}',
-                rules = {
-            {%- for _rule in _trigger["rules"] %}
-                    {
-                        ['function'] = '{{ _rule["function"] }}',
-                {%- set comma = joiner(",") %}
-                        ['arguments'] = {
-                {%- for _argument in _rule["arguments"]|sort -%}
-                    {{ comma() }}'{{ _argument }}'
-                {%- endfor -%}
-                        },
-                        ['relational_operator'] = '{{ _rule["relational_operator"] }}',
-                        ['threshold'] = {{ _rule["threshold"] }},
-                    },
-            {%- endfor %}
-                },
-            },
-        {%- endif %}
-        }),
-    {%- endfor %}
-    },
-{%- endfor %}
-}
-
-function find(policy)
-    return policies[policy]
-end
-
-return M
diff --git a/heka/files/gse_topology.lua b/heka/files/gse_topology.lua
deleted file mode 100644
index e161ad6..0000000
--- a/heka/files/gse_topology.lua
+++ /dev/null
@@ -1,31 +0,0 @@
--- Copyright 2015-2016 Mirantis, Inc.
---
--- 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.
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-clusters = {
-    ['{{ alarm_cluster_name|replace("'","\\'") }}'] = {
-{%- set comma = joiner(",") %}
-        ['members'] = {
-{%- for _member in alarm_cluster["members"]|sort -%}
-        {{ comma() }}'{{ _member|replace("'","\\'") }}'
-{%- endfor -%}
-        },
-        ['group_by'] = '{{ alarm_cluster["group_by"]|default("member") }}',
-        ['policy'] = '{{ alarm_cluster["policy"]|replace("'","\\'") }}',
-    },
-}
-
-return M
diff --git a/heka/files/heka.grain b/heka/files/heka.grain
deleted file mode 100644
index 3e3b373..0000000
--- a/heka/files/heka.grain
+++ /dev/null
@@ -1 +0,0 @@
-{{ service_grains|yaml(False) }}
diff --git a/heka/files/heka.service b/heka/files/heka.service
index 02f6aed..b95fab6 100644
--- a/heka/files/heka.service
+++ b/heka/files/heka.service
@@ -1,49 +1,18 @@
-{%- if systemd_enabled %}
-
 [Unit]
-Description=heka {{ service_name }} - data collector and processor daemon
+Description=heka - data collector and processor daemon
 After=network.target auditd.service
-ConditionPathExists=!/etc/{{ service_name }}_not_to_be_run
+ConditionPathExists=!/etc/heka/hekad_not_to_be_run
 
 [Service]
-EnvironmentFile=-/etc/default/{{ service_name }}
+EnvironmentFile=-/etc/default/heka
 User=heka
 Group=heka
-LimitNOFILE={{ max_open_files }}
-ExecStart=/usr/bin/hekad -config=/etc/{{ service_name }}
-# NOT SURE HEKA doesn't support reloading by signal
-# ExecReload=/bin/kill -HUP $MAINPID
+ExecStart=/usr/bin/hekad -config=/etc/heka/conf.d/
+ExecReload=/bin/kill -HUP $MAINPID
 KillMode=process
 Restart=on-failure
 StandardError=inherit
 
-{%- if automatic_starting %}
 [Install]
 WantedBy=multi-user.target
-{%- endif %}
 
-{%- else %}
-
-# heka {{ service_name }}
-
-description     "{{ service_name }}"
-
-{%- if automatic_starting %}
-start on runlevel [2345]
-stop on runlevel [!2345]
-{%- endif %}
-
-respawn
-
-pre-start script
-    touch /var/log/{{ service_name }}.log
-    chown heka:heka /var/log/{{ service_name }}.log
-end script
-
-script
-    # https://bugs.launchpad.net/lma-toolchain/+bug/1543289
-    ulimit -n {{ max_open_files }}
-    exec start-stop-daemon --start  --chuid heka --exec /usr/local/bin/{{ service_name }}_wrapper >> /var/log/{{ service_name }}.log 2>&1
-end script
-
-{%- endif %}
diff --git a/heka/files/input/amqp.toml b/heka/files/input/amqp.toml
new file mode 100644
index 0000000..c3dbd70
--- /dev/null
+++ b/heka/files/input/amqp.toml
@@ -0,0 +1,39 @@
+[input_{{ name }}]
+type = "AMQPInput"
+url = "amqp{% if values.ssl is defined and values.ssl.get('enabled', True) %}s{% endif %}://{{ values.user }}:{{ values.password }}@{{ values.host }}/{{ values.vhost }}"
+exchange = "{{ values.exchange }}"
+exchange_type = "{{ values.exchange_type }}"
+
+{% if values.prefetch_count is defined -%}
+prefetch_count = {{ values.prefetch_count }}
+{% endif %}
+{%- if values.exchange_durability is defined -%}
+exchange_durability = "{{ values.exchange_durability }}"
+{% endif %}
+{%- if values.exchange_auto_delete is defined -%}
+exchange_auto_delete = "{{ values.exchange_auto_delete }}"
+{% endif %}
+{%- if values.queue_auto_delete is defined -%}
+queue_auto_delete = {{ values.queue_auto_delete }}
+{% endif %}
+{%- if values.queue is defined -%}
+queue = "{{ values.queue }}"
+{% endif %}
+{%- if values.routing_key is defined -%}
+routing_key = "{{ values.routing_key }}"
+{% endif %}
+decoder = "{{ values.decoder }}"
+splitter = "{{ values.splitter }}"
+
+{%- if values.ssl is defined and values.ssl.get('enabled', True) %}
+[input_{{ name }}.tls]
+cert_file = "{{ values.ssl.cert_file }}"
+key_file = "{{ values.ssl.key_file }}"
+{%- if values.ssl.ca_file is defined %}
+root_cafile = "{{ values.ssl.ca_file }}"
+{%- endif %}
+{%- endif %}
+
+{#-
+vim: syntax=jinja
+-#}
diff --git a/heka/files/input/logstreamer.toml b/heka/files/input/logstreamer.toml
new file mode 100644
index 0000000..8e3ac11
--- /dev/null
+++ b/heka/files/input/logstreamer.toml
@@ -0,0 +1,19 @@
+[logstreamer_{{ name }}]
+type = "LogstreamerInput"
+log_directory = "{{ values.log_directory }}"
+file_match = '{{ values.file_match }}'
+{% if values.priority is defined %}
+priority = {{ values.priority }}
+{% endif %}
+{% if values.decoder is defined %}
+decoder = "{{ values.decoder }}"
+{% endif %}
+{% if values.splitter is defined %}
+splitter = '{{ values.splitter }}'
+{% endif %}
+{% if values.differentiator is defined %}
+differentiator = {{ values.differentiator }}
+{% endif %}
+{% if values.oldest_duration is defined %}
+oldest_duration = "{{ values.oldest_duration }}"
+{% endif %}
diff --git a/heka/files/input/process.toml b/heka/files/input/process.toml
new file mode 100644
index 0000000..a7b4379
--- /dev/null
+++ b/heka/files/input/process.toml
@@ -0,0 +1,29 @@
+[<%= @title %>_process]
+type="ProcessInput"
+ticker_interval = <%= @ticker_interval %>
+decoder = "<%= @decoder %>_decoder"
+<% if @stdout -%>
+stdout = true
+<% else %>
+stdout = false
+<% end %>
+<% if @stderr -%>
+stderr = true
+<% else %>
+stderr = false
+<% end %>
+
+<% if @splitter -%>
+splitter = "<%= @splitter %>_splitter"
+<% else -%>
+splitter = "NullSplitter"
+<% end -%>
+
+<% @commands.each_with_index do |command, i| -%>
+ <% command.each do |cmd, args| -%>
+  [<%= @title %>_process.command.<%= i %>]
+   bin = "<%= cmd %>"
+   args = [ <%= args.collect{ |x| '"%s"' % x }.join(", ") %> ]
+ <%end%>
+<% end %>
+
diff --git a/heka/files/lma_alarm.lua b/heka/files/lma_alarm.lua
deleted file mode 100644
index b826112..0000000
--- a/heka/files/lma_alarm.lua
+++ /dev/null
@@ -1,47 +0,0 @@
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-local alarms = {
-{%- for _trigger_name in alarm.triggers %}
-{%- set _trigger = trigger.get(_trigger_name) %}
-{%- if _trigger and _trigger.get('enabled', True) %}
-  {
-    ['name'] = '{{ _trigger_name}}',
-    ['description'] = '{{ _trigger.get("description", "").replace("'", "\\'") }}',
-    ['severity'] = '{{ _trigger.severity }}',
-    {%- if _trigger.no_data_policy is defined %}
-    ['no_data_policy'] = '{{ _trigger.no_data_policy }}',
-    {%- endif %}
-    ['trigger'] = {
-      ['logical_operator'] = '{{ _trigger.get("logical_operator", "or") }}',
-      ['rules'] = {
-        {%- for _rule in _trigger.get('rules', []) %}
-        {
-          ['metric'] = '{{ _rule.metric }}',
-          ['fields'] = {
-            {%- for _field_name, _field_value in _rule.get('field', {}).iteritems() %}
-            ['{{ _field_name }}'] = '{{ _field_value }}',
-            {%- endfor %}
-          },
-          ['relational_operator'] = '{{ _rule.relational_operator }}',
-          ['threshold'] = '{{ _rule.threshold }}',
-          ['window'] = '{{ _rule.window }}',
-          ['periods'] = '{{ _rule.get('periods', 0) }}',
-          ['function'] = '{{ _rule.function }}',
-          {%- if _rule.group_by is defined %}
-          ['group_by'] = {
-            {%- for _group_by in _rule.group_by %}
-            '{{ _group_by }}',
-            {%- endfor %}
-          },
-          {%- endif %}
-        },
-        {%- endfor %}
-      },
-    },
-  },
-{%- endif %}
-{%- endfor %}
-}
-
-return alarms
diff --git a/heka/files/lua/common/accumulator.lua b/heka/files/lua/common/accumulator.lua
deleted file mode 100644
index 9b01a8f..0000000
--- a/heka/files/lua/common/accumulator.lua
+++ /dev/null
@@ -1,63 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local time = os.time
-local string = string
-local table = table
-local setmetatable = setmetatable
-local ipairs = ipairs
-local pairs = pairs
-local tostring = tostring
-local type = type
-
-local Accumulator = {}
-Accumulator.__index = Accumulator
-
-setfenv(1, Accumulator) -- Remove external access to contain everything in the module
-
--- Create a new Accumulator
---
--- flush_count: the maximum number of items to accumulate before flushing
--- flush_interval: the maximum number of seconds to wait before flushing
--- callback: the function to call back when flushing the accumulator, it will
--- receive the table of accumulated items as parameter.
-function Accumulator.new(flush_count, flush_interval, callback)
-    local a = {}
-    setmetatable(a, Accumulator)
-    a.flush_count = flush_count
-    a.flush_interval = flush_interval
-    a.flush_cb = callback
-    a.last_flush = time() * 1e9
-    a.buffer = {}
-    return a
-end
-
--- Flush the buffer if flush_count or flush_interval are met
---
--- ns: the current timestamp in nanosecond (optional)
-function Accumulator:flush(ns)
-    local now = ns or time() * 1e9
-    if #self.buffer > self.flush_count or now - self.last_flush > self.flush_interval then
-        self.flush_cb(self.buffer)
-        self.buffer = {}
-        self.last_flush = now
-    end
-end
-
--- Append an item to the buffer and flush the buffer if needed
-function Accumulator:append(item)
-    self.buffer[#self.buffer+1] = item
-    self:flush()
-end
-
-return Accumulator
diff --git a/heka/files/lua/common/afd.lua b/heka/files/lua/common/afd.lua
deleted file mode 100644
index 2d47040..0000000
--- a/heka/files/lua/common/afd.lua
+++ /dev/null
@@ -1,179 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local cjson = require 'cjson'
-local string = require 'string'
-
-local lma = require 'lma_utils'
-local consts = require 'gse_constants'
-
-local read_message = read_message
-local assert = assert
-local ipairs = ipairs
-local pairs = pairs
-local pcall = pcall
-local table = table
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-function get_entity_name(field)
-    return read_message(string.format('Fields[%s]', field))
-end
-
-function get_status()
-    return read_message('Fields[value]')
-end
-
-function extract_alarms()
-    local ok, payload = pcall(cjson.decode, read_message('Payload'))
-    if not ok or not payload.alarms then
-        return nil
-    end
-    return payload.alarms
-end
-
--- return a human-readable message from an alarm table
--- for instance: "CPU load too high (WARNING, rule='last(load_midterm)>=5', current=7)"
-function get_alarm_for_human(alarm)
-    local metric
-    local fields = {}
-    for name, value in pairs(alarm.fields) do
-        fields[#fields+1] = name .. '="' .. value .. '"'
-    end
-    if #fields > 0 then
-        metric = string.format('%s[%s]', alarm.metric, table.concat(fields, ','))
-    else
-        metric = alarm.metric
-    end
-
-    local host = ''
-    if alarm.hostname then
-        host = string.format(', host=%s', alarm.hostname)
-    end
-
-    return string.format(
-        "%s (%s, rule='%s(%s)%s%s', current=%.2f%s)",
-        alarm.message,
-        alarm.severity,
-        alarm['function'],
-        metric,
-        alarm.operator,
-        alarm.threshold,
-        alarm.value,
-        host
-    )
-end
-
-function alarms_for_human(alarms)
-    local alarm_messages = {}
-    local hint_messages = {}
-
-    for _, v in ipairs(alarms) do
-        if v.tags and v.tags.dependency_level and v.tags.dependency_level == 'hint' then
-            hint_messages[#hint_messages+1] = get_alarm_for_human(v)
-        else
-            alarm_messages[#alarm_messages+1] = get_alarm_for_human(v)
-        end
-    end
-
-    if #hint_messages > 0 then
-        alarm_messages[#alarm_messages+1] = "Other related alarms:"
-    end
-    for _, v in ipairs(hint_messages) do
-        alarm_messages[#alarm_messages+1] = v
-    end
-
-    return alarm_messages
-end
-
-local alarms = {}
-
--- append an alarm to the list of pending alarms
--- the list is sent when inject_afd_metric is called
-function add_to_alarms(status, fn, metric, fields, tags, operator, value, threshold, window, periods, message)
-    local severity = consts.status_label(status)
-    assert(severity)
-    alarms[#alarms+1] = {
-        severity=severity,
-        ['function']=fn,
-        metric=metric,
-        fields=fields or {},
-        tags=tags or {},
-        operator=operator,
-        value=value,
-        threshold=threshold,
-        window=window or 0,
-        periods=periods or 0,
-        message=message
-    }
-end
-
-function get_alarms()
-    return alarms
-end
-
-function reset_alarms()
-    alarms = {}
-end
-
--- inject an AFD event into the Heka pipeline
-function inject_afd_metric(value, hostname, afd_name, dimensions, to_alerting)
-    local payload
-
-    if #alarms > 0 then
-        payload = lma.safe_json_encode({alarms=alarms})
-        reset_alarms()
-        if not payload then
-            return
-        end
-    else
-        -- because cjson encodes empty tables as objects instead of arrays
-        payload = '{"alarms":[]}'
-    end
-
-    local no_alerting
-    if to_alerting ~= nil and to_alerting == false then
-        no_alerting = true
-    end
-
-    local msg = {
-        Type = 'afd_metric',
-        Payload = payload,
-        Fields = {
-            name = 'status',
-            value = value,
-            hostname = hostname,
-            member = afd_name,
-            no_alerting = no_alerting,
-            tag_fields = {'hostname', 'member'}
-        }
-    }
-
-    for name, value in pairs(dimensions) do
-        table.insert(msg.Fields.tag_fields, name)
-        msg.Fields[name] = value
-    end
-
-    lma.inject_tags(msg)
-    lma.safe_inject_message(msg)
-end
-
-MATCH = 1
-NO_MATCH = 2
-NO_DATA = 3
-MISSING_DATA = 4
-
-
-return M
diff --git a/heka/files/lua/common/afd_alarm.lua b/heka/files/lua/common/afd_alarm.lua
deleted file mode 100644
index 4fd660f..0000000
--- a/heka/files/lua/common/afd_alarm.lua
+++ /dev/null
@@ -1,216 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local assert = assert
-local ipairs = ipairs
-local pairs = pairs
-local string = string
-local setmetatable = setmetatable
-
--- LMA libs
-local utils = require 'lma_utils'
-local table_utils = require 'table_utils'
-local consts = require 'gse_constants'
-local afd = require 'afd'
-local Rule = require 'afd_rule'
-
-local SEVERITIES = {
-    warning = consts.WARN,
-    critical = consts.CRIT,
-    down = consts.DOWN,
-    unknown = consts.UNKW,
-    okay = consts.OKAY,
-}
-
-local Alarm = {}
-Alarm.__index = Alarm
-
-setfenv(1, Alarm) -- Remove external access to contain everything in the module
-
-function Alarm.new(alarm)
-    local a = {}
-    setmetatable(a, Alarm)
-    a._metrics_list = nil
-    a.name = alarm.name
-    a.description = alarm.description
-    if alarm.trigger.logical_operator then
-        a.logical_operator = string.lower(alarm.trigger.logical_operator)
-    else
-        a.logical_operator = 'or'
-    end
-    a.severity_str = string.upper(alarm.severity)
-    a.severity = SEVERITIES[string.lower(alarm.severity)]
-    assert(a.severity ~= nil)
-
-    a.skip_when_no_data = false
-    if alarm.no_data_policy then
-        if string.lower(alarm.no_data_policy) == 'skip' then
-            a.skip_when_no_data = true
-        else
-            a.no_data_severity = SEVERITIES[string.lower(alarm.no_data_policy)]
-        end
-    else
-        a.no_data_severity = consts.UNKW
-    end
-    assert(a.skip_when_no_data or a.no_data_severity ~= nil)
-
-    a.rules = {}
-    a.initial_wait = 0
-    for _, rule in ipairs(alarm.trigger.rules) do
-        local r = Rule.new(rule)
-        a.rules[#a.rules+1] = r
-        local wait = r.window * r.periods
-        if wait > a.initial_wait then
-            a.initial_wait = wait * 1e9
-        end
-    end
-    a.start_time_ns = 0
-
-    return a
-end
-
--- return the Set of metrics used by the alarm
-function Alarm:get_metrics()
-    if not self._metrics_list then
-        self._metrics_list = {}
-        for _, rule in ipairs(self.rules) do
-            if not table_utils.item_find(rule.metric, metrics) then
-                self._metrics_list[#self._metrics_list+1] = rule.metric
-            end
-        end
-    end
-    return self._metrics_list
-end
-
--- return a list of field names used for the metric
--- (can have duplicate names)
-function Alarm:get_metric_fields(metric_name)
-    local fields = {}
-    for _, rule in ipairs(self.rules) do
-        if rule.metric == metric_name then
-            for k, _ in pairs(rule.fields) do
-                fields[#fields+1] = k
-            end
-            for _, g in ipairs(rule.group_by) do
-                fields[#fields+1] = g
-            end
-        end
-    end
-    return fields
-end
-
-function Alarm:has_metric(metric)
-    return table_utils.item_find(metric, self:get_metrics())
-end
-
--- dispatch datapoint in datastores
-function Alarm:add_value(ts, metric, value, fields)
-    local data
-    for id, rule in pairs(self.rules) do
-        if rule.metric == metric then
-            rule:add_value(ts, value, fields)
-        end
-    end
-end
-
--- return: state of alarm and a list of alarm details.
---
--- with alarm list when state != OKAY:
--- {
---  {
---    value = <current value>,
---    fields = <metric fields table>,
---    message = <string>,
---  },
--- }
-function Alarm:evaluate(ns)
-    local state = consts.OKAY
-    local matches = 0
-    local all_alerts = {}
-    local function add_alarm(rule, value, message, fields)
-        all_alerts[#all_alerts+1] = {
-            severity = self.severity_str,
-            ['function'] = rule.fct,
-            metric = rule.metric,
-            operator = rule.relational_operator,
-            threshold = rule.threshold,
-            window = rule.window,
-            periods = rule.periods,
-            value = value,
-            fields = fields,
-            message = message
-        }
-    end
-    local one_unknown = false
-    local msg
-
-    for _, rule in ipairs(self.rules) do
-        local eval, context_list = rule:evaluate(ns)
-        if eval == afd.MATCH then
-            matches = matches + 1
-            msg = self.description
-        elseif eval == afd.MISSING_DATA then
-            msg = 'No datapoint have been received over the last ' .. rule.observation_window .. ' seconds'
-            one_unknown = true
-        elseif eval == afd.NO_DATA then
-            msg = 'No datapoint have been received ever'
-            one_unknown = true
-        end
-        for _, context in ipairs(context_list) do
-            add_alarm(rule, context.value, msg,
-                      context.fields)
-        end
-    end
-
-    if self.logical_operator == 'and' then
-        if one_unknown then
-            if self.skip_when_no_data then
-                state = nil
-            else
-                state = self.no_data_severity
-            end
-        elseif #self.rules == matches then
-            state = self.severity
-        end
-    elseif self.logical_operator == 'or' then
-        if matches > 0 then
-            state = self.severity
-        elseif one_unknown then
-            if self.skip_when_no_data then
-                state = nil
-            else
-                state = self.no_data_severity
-            end
-        end
-    end
-
-    if state == nil or state == consts.OKAY then
-        all_alerts = {}
-    end
-    return state, all_alerts
-end
-
-function Alarm:set_start_time(ns)
-    self.start_time_ns = ns
-end
-
-function Alarm:is_evaluation_time(ns)
-    local delta = ns - self.start_time_ns
-    if delta >= self.initial_wait then
-        return true
-    end
-    return false
-end
-
-return Alarm
diff --git a/heka/files/lua/common/afd_alarms.lua b/heka/files/lua/common/afd_alarms.lua
deleted file mode 100644
index 74dc328..0000000
--- a/heka/files/lua/common/afd_alarms.lua
+++ /dev/null
@@ -1,120 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local pairs = pairs
-local ipairs = ipairs
-local lma = require 'lma_utils'
-local table_utils = require 'table_utils'
-local consts = require 'gse_constants'
-local gse_utils = require 'gse_utils'
-local Alarm = require 'afd_alarm'
-
-local all_alarms = {}
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
--- return a list of field names required for the metric
-function get_metric_fields(metric_name)
-    local fields = {}
-    for name, alarm in pairs(all_alarms) do
-        local mf = alarm:get_metric_fields(metric_name)
-        if mf then
-            for _, field in pairs(mf) do
-                if not table_utils.item_find(field, fields) then
-                    fields[#fields+1] = field
-                end
-            end
-        end
-    end
-    return fields
-end
-
--- return list of alarms interested by a metric
-function get_interested_alarms(metric)
-    local interested_alarms = {}
-    for _, alarm in pairs(all_alarms) do
-        if alarm:has_metric(metric) then
-
-            interested_alarms[#interested_alarms+1] = alarm
-        end
-    end
-    return interested_alarms
-end
-
-function add_value(ts, metric, value, fields)
-    local interested_alarms = get_interested_alarms(metric)
-    for _, alarm in ipairs (interested_alarms) do
-        alarm:add_value(ts, metric, value, fields)
-    end
-end
-
-function reset_alarms()
-    all_alarms = {}
-end
-
-function evaluate(ns)
-    local global_state
-    local all_alerts = {}
-    for _, alarm in pairs(all_alarms) do
-        if alarm:is_evaluation_time(ns) then
-            local state, alerts = alarm:evaluate(ns)
-            global_state = gse_utils.max_status(state, global_state)
-            for _, a in ipairs(alerts) do
-                all_alerts[#all_alerts+1] = { state=state, alert=a }
-            end
-            -- raise the first triggered alarm except for OKAY/UNKW states
-            if global_state ~= consts.UNKW and global_state ~= consts.OKAY then
-                break
-            end
-        end
-    end
-    return global_state, all_alerts
-end
-
-function get_alarms()
-    return all_alarms
-end
-function get_alarm(alarm_name)
-    for _, a in ipairs(all_alarms) do
-        if a.name == alarm_name then
-            return a
-        end
-    end
-end
-
-function load_alarm(alarm)
-    local A = Alarm.new(alarm)
-    all_alarms[#all_alarms+1] = A
-end
-
-function load_alarms(alarms)
-    for _, alarm in ipairs(alarms) do
-        load_alarm(alarm)
-    end
-end
-
-local started = false
-function set_start_time(ns)
-    for _, alarm in ipairs(all_alarms) do
-        alarm:set_start_time(ns)
-    end
-    started = true
-end
-
-function is_started()
-    return started
-end
-
-return M
diff --git a/heka/files/lua/common/afd_rule.lua b/heka/files/lua/common/afd_rule.lua
deleted file mode 100644
index 680ea61..0000000
--- a/heka/files/lua/common/afd_rule.lua
+++ /dev/null
@@ -1,324 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local anomaly = require('anomaly')
-local circular_buffer = require('circular_buffer')
-local setmetatable = setmetatable
-local ipairs = ipairs
-local pairs = pairs
-local math = require 'math'
-local string = string
-local table = table
-local assert = assert
-local type = type
-
--- LMA libs
-local utils = require 'lma_utils'
-local table_utils = require 'table_utils'
-local consts = require 'gse_constants'
-local gse_utils = require 'gse_utils'
-local afd = require 'afd'
-local matching = require 'value_matching'
-
-local MIN_WINDOW = 10
-local MIN_PERIOD = 1
-local SECONDS_PER_ROW = 5
-
-local Rule = {}
-Rule.__index = Rule
-
-setfenv(1, Rule) -- Remove external access to contain everything in the module
-
-function Rule.new(rule)
-    local r = {}
-    setmetatable(r, Rule)
-
-    local win = MIN_WINDOW
-    if rule.window and rule.window + 0 > 0 then
-        win = rule.window + 0
-    end
-    r.window = win
-    local periods = MIN_PERIOD
-    if rule.periods and rule.periods + 0 > 0 then
-        periods = rule.periods + 0
-    end
-    r.periods = periods
-    r.relational_operator = rule.relational_operator
-    r.metric = rule.metric
-    r.fields = rule.fields or {}
-
-    -- build field matching
-    r.field_matchers = {}
-    for f, expression in pairs(r.fields) do
-        r.field_matchers[f] = matching.new(expression)
-    end
-
-    r.fct = rule['function']
-    r.threshold = rule.threshold + 0
-    r.value_index = rule.value or nil -- Can be nil
-
-    -- build unique rule id
-    local arr = {r.metric, r.fct, r.window, r.periods}
-    for f, v in table_utils.orderedPairs(r.fields or {}) do
-        arr[#arr+1] = string.format('(%s=%s)', f, v)
-    end
-    r.rule_id = table.concat(arr, '/')
-
-    r.group_by = rule.group_by or {}
-
-    if r.fct == 'roc' then
-        -- We use the name of the metric as the payload_name.
-        --
-        -- The ROC algorithm needs the following parameters:
-        --   - the number of intervals in the analysis window
-        --   - the number of intervals in the historical analysis window
-        --   - the threshold
-        --
-        -- r.window is an interval in seconds. So to get the number of
-        -- intervals we divide r.window by the number of seconds per row.
-        --
-        -- r.periods represents the number of windows that we want to use for
-        -- the historical analysis. As we tell the ROC algorithm to use all
-        -- remaining buffer for the historical window we need to allocate
-        -- r.periods * (r.window / SECONDS_PER_ROW) for the historical
-        -- analysis and 2 additional periods for the previous and current
-        -- analysis windows.
-        --
-        local cfg_str = string.format('roc("%s",1,%s,0,%s,false,false)',
-                                       r.metric,
-                                       math.ceil(r.window/SECONDS_PER_ROW),
-                                       r.threshold)
-        r.roc_cfg = anomaly.parse_config(cfg_str)
-        r.cbuf_size = math.ceil(r.window / SECONDS_PER_ROW) * (r.periods + 2)
-    else
-        r.roc_cfg = nil
-        r.cbuf_size = math.ceil(r.window * r.periods / SECONDS_PER_ROW)
-    end
-    r.ids_datastore = {}
-    r.datastore = {}
-    r.observation_window = math.ceil(r.window * r.periods)
-
-    return r
-end
-
-function Rule:get_datastore_id(fields)
-    if #self.group_by == 0 or fields == nil then
-        return self.rule_id
-    end
-
-    local arr = {}
-    arr[#arr + 1] = self.rule_id
-    for _, g in ipairs(self.group_by) do
-        arr[#arr + 1] = fields[g]
-    end
-    return table.concat(arr, '/')
-end
-
-function Rule:fields_accepted(fields)
-    if not fields then
-        fields = {}
-    end
-    local matched_fields = 0
-    local no_match_on_fields = true
-    for f, expression in pairs(self.field_matchers) do
-        no_match_on_fields = false
-        for k, v in pairs(fields) do
-            if k == f then
-                if expression:matches(v) then
-                    matched_fields = matched_fields + 1
-                else
-                    return false
-                end
-            end
-        end
-    end
-    return no_match_on_fields or matched_fields > 0
-end
-
-function Rule:get_circular_buffer()
-    local cbuf
-    if self.fct == 'avg' then
-        cbuf = circular_buffer.new(self.cbuf_size, 2, SECONDS_PER_ROW)
-        cbuf:set_header(1, self.metric, 'sum', 'sum')
-        cbuf:set_header(2, self.metric, 'count', 'sum')
-    elseif self.fct == 'min' or self.fct == 'max' then
-        cbuf = circular_buffer.new(self.cbuf_size, 1, SECONDS_PER_ROW)
-        cbuf:set_header(1, self.metric, self.fct)
-    else
-        cbuf = circular_buffer.new(self.cbuf_size, 1, SECONDS_PER_ROW)
-        cbuf:set_header(1, self.metric)
-    end
-    return cbuf
-end
-
--- store datapoints in cbuf, create the cbuf if not exists.
--- value can be a table where the index to choose is referenced by self.value_index
-function Rule:add_value(ts, value, fields)
-    if not self:fields_accepted(fields) then
-        return
-    end
-    if type(value) == 'table' then
-        value = value[self.value_index]
-    end
-    if value == nil then
-        return
-    end
-
-    local data
-    local uniq_field_id = self:get_datastore_id(fields)
-    if not self.datastore[uniq_field_id] then
-        self.datastore[uniq_field_id] = {
-            fields = self.fields,
-            cbuf = self:get_circular_buffer()
-        }
-        if #self.group_by > 0 then
-            self.datastore[uniq_field_id].fields = fields
-        end
-
-        self:add_datastore(uniq_field_id)
-    end
-    data = self.datastore[uniq_field_id]
-
-    if self.fct == 'avg' then
-        data.cbuf:add(ts, 1, value)
-        data.cbuf:add(ts, 2, 1)
-    else
-        data.cbuf:set(ts, 1, value)
-    end
-end
-
-function Rule:add_datastore(id)
-    if not table_utils.item_find(id, self.ids_datastore) then
-        self.ids_datastore[#self.ids_datastore+1] = id
-    end
-end
-
-function Rule:compare_threshold(value)
-    return gse_utils.compare_threshold(value, self.relational_operator, self.threshold)
-end
-
-local function isnumber(value)
-    return value ~= nil and not (value ~= value)
-end
-
-local available_functions = {last=true, avg=true, max=true, min=true, sum=true,
-                             variance=true, sd=true, diff=true, roc=true}
-
--- evaluate the rule against datapoints
--- return a list: match (bool or string), context ({value=v, fields=list of field table})
---
--- examples:
---   true, { {value=100, fields={{queue='nova'}, {queue='neutron'}}, ..}
---   false, { {value=10, fields={}}, ..}
--- with 2 special cases:
---   - never receive one datapoint
---      'nodata', {}
---   - no more datapoint received for a metric
---      'missing', {value=-1, fields={}}
--- There is a drawback with the 'missing' state and could leads to emit false positive
--- state. For example when the monitored thing has been renamed/deleted,
--- it's normal to don't receive datapoint anymore .. for example a filesystem.
-function Rule:evaluate(ns)
-    local fields = {}
-    local one_match, one_no_match, one_missing_data = false, false, false
-    for _, id in ipairs(self.ids_datastore) do
-        local data = self.datastore[id]
-        if data then
-            local cbuf_time = data.cbuf:current_time()
-            -- if we didn't receive datapoint within the observation window this means
-            -- we don't receive anymore data and cannot compute the rule.
-            if ns - cbuf_time > self.observation_window * 1e9 then
-                one_missing_data = true
-                fields[#fields+1] = {value = -1, fields = data.fields}
-            else
-                assert(available_functions[self.fct])
-                local result
-
-                if self.fct == 'roc' then
-                    local anomaly_detected, _ = anomaly.detect(ns, self.metric, data.cbuf, self.roc_cfg)
-                    if anomaly_detected then
-                        one_match = true
-                        fields[#fields+1] = {value=-1, fields=data.fields}
-                    else
-                        one_no_match = true
-                    end
-                elseif self.fct == 'avg' then
-                    local total
-                    total = data.cbuf:compute('sum', 1)
-                    local count = data.cbuf:compute('sum', 2)
-                    result = total/count
-                elseif self.fct == 'last' then
-                    local last
-                    local t = ns
-                    while (not isnumber(last)) and t >= ns - self.observation_window * 1e9 do
-                        last = data.cbuf:get(t, 1)
-                        t = t - SECONDS_PER_ROW * 1e9
-                    end
-                    if isnumber(last) then
-                        result = last
-                    else
-                        one_missing_data = true
-                        fields[#fields+1] = {value = -1, fields = data.fields}
-                    end
-                elseif self.fct == 'diff' then
-                    local first, last
-
-                    local t = ns
-                    while (not isnumber(last)) and t >= ns - self.observation_window * 1e9 do
-                        last = data.cbuf:get(t, 1)
-                        t = t - SECONDS_PER_ROW * 1e9
-                    end
-
-                    if isnumber(last) then
-                        t = ns - self.observation_window * 1e9
-                        while (not isnumber(first)) and t <= ns do
-                            first = data.cbuf:get(t, 1)
-                            t = t + SECONDS_PER_ROW * 1e9
-                        end
-                    end
-
-                    if not isnumber(last) or not isnumber(first) then
-                        one_missing_data = true
-                        fields[#fields+1] = {value = -1, fields = data.fields}
-                    else
-                        result = last - first
-                    end
-                else
-                    result = data.cbuf:compute(self.fct, 1)
-                end
-
-                if result then
-                    local m = self:compare_threshold(result)
-                    if m then
-                        one_match = true
-                        fields[#fields+1] = {value=result, fields=data.fields}
-                    else
-                        one_no_match = true
-                    end
-                end
-            end
-        end
-    end
-    if one_match then
-        return afd.MATCH, fields
-    elseif one_missing_data then
-        return afd.MISSING_DATA, fields
-    elseif one_no_match then
-        return afd.NO_MATCH, {}
-    else
-        return afd.NO_DATA, {{value=-1, fields=self.fields}}
-    end
-end
-
-return Rule
diff --git a/heka/files/lua/common/ceilometer.lua b/heka/files/lua/common/ceilometer.lua
deleted file mode 100644
index 56b1eec..0000000
--- a/heka/files/lua/common/ceilometer.lua
+++ /dev/null
@@ -1,60 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-local table = require 'table'
-
-local samples = require 'samples'
-local resources = require 'resources'
-local patt = require 'patterns'
-local utils = require 'lma_utils'
-
-local l = require 'lpeg'
-l.locale(l)
-
-local fields_grammar = l.Ct((l.C((l.P(1) - l.P" ")^1) * l.P" "^0)^0)
-local metadata_fields = fields_grammar:match(
-    read_config("metadata_fields") or ""
-)
-local decode_resources = read_config('decode_resources') or false
-
-
-local samples_decoder = samples.new(metadata_fields)
-local resource_decoder = nil
-
-if decode_resources then
-    resource_decoder = resources.new()
-end
-
-local CeilometerDecoder = {}
-CeilometerDecoder.__index = CeilometerDecoder
-
-setfenv(1, CeilometerDecoder) -- Remove external access to contain everything in the module
-
-function inject(code, msg)
-    if code == 0 and msg then
-        return utils.safe_inject_message(msg)
-    else
-        return code, msg
-    end
-end
-
-function decode(data)
-    local code, msg = inject(samples_decoder:decode(data))
-    if code == 0 and resource_decoder then
-        code, msg = inject(resource_decoder:decode(data))
-    end
-    return code, msg
-end
-
-return CeilometerDecoder
diff --git a/heka/files/lua/common/contrail_patterns.lua b/heka/files/lua/common/contrail_patterns.lua
deleted file mode 100644
index 3383a3b..0000000
--- a/heka/files/lua/common/contrail_patterns.lua
+++ /dev/null
@@ -1,77 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local dt     = require "date_time"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local tonumber = tonumber
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-local function to_secfrac (num)
-    return tonumber(num) / 1000
-end
-
-local sp = patt.sp
-local spaces = patt.sp^1
-local pgname = patt.programname
-local delimeter = l.P": "
-local message   = l.Cg(patt.Message / utils.chomp, "Message")
-local severity  = l.Cg(pgname, "Severity")
-
--- Common patterns
-local modulename =  l.Cg(pgname, "Module")
-local ip_address = l.Cg((l.digit + patt.dot)^1, "ip_address")
-local http_status = l.Cg(patt.Number, "status")
-local http_request_time = l.Cg(patt.Number, "request_time")
-local delim = (patt.sp + patt.dash)^1
-local hostname = l.Cg(patt.programname, "Hostname")
-local process_info = l.P"[" * "Thread" * sp * l.Cg(l.digit^1, "ThreadId") *
-                     ", " * "Pid" * sp * l.Cg(l.digit^1, "Pid") * "]"
-
--- Timestamp patterns
--- 10/31/2016 03:40:47 AM [contrail-alarm-gen]: blabla
-local log_timestamp = l.Cg(dt.build_strftime_grammar("%m/%d/%Y %r") / dt.time_to_ns, "Timestamp")
-
--- 172.16.10.101 - - [2016-10-31 12:50:36] "POST /subscribe HTTP/1.1" 200 715 0.058196
-local api_timestamp = l.Cg(patt.Timestamp, "Timestamp")
-
--- 2016-10-27 Thu 17:50:37:633.908 CEST  ctl01 [Thread 140024858027968, Pid 23338]: DnsAgent [SYS_INFO]: blabla
-local timezone = dt.timezone + l.P"CET" * l.Cg(l.Cc"+", "offset_sign") *
-                 l.Cg(l.Cc"01" / tonumber, "offset_hour") * l.Cg(l.Cc"00"/ tonumber, "offset_min")
-local day_of_week = l.Cg(l.P"Mon" + l.P"Tue" + l.P"Wed" + l.P"Thu" +
-                         l.P"Fri" + l.P"Sat" + l.P"Sun", "day_of_week")
-local secfrac_grammar = l.Cg((l.digit^1 * patt.dot * l.digit^1) / to_secfrac, "sec_frac")
-local ts_grammar = l.Ct(dt.rfc3339_full_date * patt.sp * day_of_week * sp *
-                        dt.rfc3339_partial_time * ":" * secfrac_grammar * sp * timezone)
-local control_timestamp = l.Cg(ts_grammar / dt.time_to_ns, "Timestamp")
-
--- Complete grammars
--- 10/31/2016 03:40:47 AM [contrail-alarm-gen]: blabla
-LogGrammar = l.Ct(log_timestamp * patt.sp * "[" * modulename * "]:" * patt.sp * message)
-
--- 172.16.10.101 - - [2016-10-31 12:50:36] "POST /subscribe HTTP/1.1" 200 715 0.058196
-ApiGrammar = l.Ct(ip_address * delim * "["* api_timestamp * "]" * sp * message)
-RequestGrammar = l.Ct(l.P'"' * patt.http_request * l.P'"' * sp * http_status * sp * patt.Number * sp * http_request_time)
-
--- 2016-10-27 Thu 17:50:37:633.908 CEST  ctl01 [Thread 140024858027968, Pid 23338]: DnsAgent [SYS_INFO]: blabla
--- 2016-11-01 Tue 05:24:26:590.824 CET  ctl01 [Thread 140310906029824, Pid 18319]: SANDESH: blabla
-ControlGrammar = l.Ct(control_timestamp * spaces * hostname * sp * process_info * l.P": " *
-					   modulename * (sp * "[" * severity * "]")^-1 * l.P": "^-1 * message)
-
-return M
diff --git a/heka/files/lua/common/elasticsearch_resources.lua b/heka/files/lua/common/elasticsearch_resources.lua
deleted file mode 100644
index b77caa6..0000000
--- a/heka/files/lua/common/elasticsearch_resources.lua
+++ /dev/null
@@ -1,76 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local string = require "string"
-local cjson = require "cjson"
-local utils = require "lma_utils"
-local table = require "table"
-local pairs = pairs
-local read_message = read_message
-local utils = require "lma_utils"
-
-local index = read_config("index") or "index"
-local type_name = read_config("type_name") or "source"
-
-local ResourceEncoder = {}
-ResourceEncoder.__index = ResourceEncoder
-
-setfenv(1, ResourceEncoder) -- Remove external access to contain everything in the module
-
-function encode()
-    local ns
-    local resources = cjson.decode(read_message("Payload"))
-    payload = {}
-    for resource_id, resource in pairs(resources) do
-        local update = cjson.encode({
-            update = {_index = index, _type = type_name, _id = resource_id}
-        })
-        local body = {
-            script = 'ctx._source.meters += meter;' ..
-            'ctx._source.user_id = user_id;' ..
-            'ctx._source.project_id = project_id;' ..
-            'ctx._source.source = source; ' ..
-            'ctx._source.metadata =  ' ..
-            'ctx._source.last_sample_timestamp <= timestamp ? ' ..
-            'metadata : ctx._source.metadata;' ..
-            'ctx._source.last_sample_timestamp = ' ..
-            'ctx._source.last_sample_timestamp < timestamp ?' ..
-            'timestamp : ctx._source.last_sample_timestamp;' ..
-            'ctx._source.first_sample_timestamp = ' ..
-            'ctx._source.first_sample_timestamp > timestamp ?' ..
-            'timestamp : ctx._source.first_sample_timestamp;',
-            params = {
-                meter = resource.meter,
-                metadata = resource.metadata,
-                timestamp = resource.timestamp,
-                user_id = resource.user_id or '',
-                project_id = resource.project_id or '',
-                source = resource.source or '',
-            },
-            upsert = {
-                first_sample_timestamp = resource.timestamp,
-                last_sample_timestamp = resource.timestamp,
-                project_id = resource.project_id or '',
-                user_id = resource.user_id or '',
-                source = resource.source or '',
-                metadata = resource.metadata,
-                meters = resource.meter
-            }
-        }
-        bulk_body = string.format("%s\n%s\n", update, cjson.encode(body))
-        table.insert(payload, bulk_body)
-    end
-    return 0, table.concat(payload)
-end
-
-return ResourceEncoder
\ No newline at end of file
diff --git a/heka/files/lua/common/gse.lua b/heka/files/lua/common/gse.lua
deleted file mode 100644
index 3e6948e..0000000
--- a/heka/files/lua/common/gse.lua
+++ /dev/null
@@ -1,176 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local consts = require 'gse_constants'
-local string = require 'string'
-local table = require 'table'
-local GseCluster = require 'gse_cluster'
-local lma = require 'lma_utils'
-local table_utils = require 'table_utils'
-
-local pairs = pairs
-local ipairs = ipairs
-local assert = assert
-local type = type
-local read_message = read_message
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
--- Hash of GseCluster instances organized by name
-local clusters = {}
--- Reverse index table to map cluster's members to clusters
-local reverse_cluster_index = {}
--- Array of cluster names ordered by dependency
-local ordered_clusters = {}
-
-function add_cluster(cluster_id, members, hints, group_by, policy_rules)
-    assert(type(members) == 'table')
-    assert(type(hints) == 'table')
-    assert(type(policy_rules) == 'table')
-
-    local cluster = GseCluster.new(members, hints, group_by, policy_rules)
-    clusters[cluster_id] = cluster
-
-    -- update the reverse index
-    for _, member in ipairs(members) do
-        if not reverse_cluster_index[member] then
-            reverse_cluster_index[member] = {}
-        end
-        local reverse_table = reverse_cluster_index[member]
-        if not table_utils.item_find(cluster_id, reverse_table) then
-            reverse_table[#reverse_table+1] = cluster_id
-        end
-    end
-
-    if not table_utils.item_find(cluster_id, ordered_clusters) then
-        local after_index = 1
-        for current_pos, id in ipairs(ordered_clusters) do
-            if table_utils.item_find(id, cluster.hints) then
-                after_index = current_pos + 1
-            end
-        end
-
-        local index = after_index
-        for _, item in pairs(clusters) do
-            for _, hint in pairs(item.hints) do
-                if hint == cluster_id then
-                    local pos = table_utils.item_pos(hint, cluster_orderings)
-                    if pos and pos <= index then
-                        index = pos
-                    elseif index > after_index then
-                        error('circular dependency between clusters!')
-                    end
-                end
-            end
-        end
-        table.insert(ordered_clusters, index, cluster_id)
-    end
-end
-
-function get_ordered_clusters()
-    return ordered_clusters
-end
-
-function cluster_exists(cluster_id)
-    return clusters[cluster_id] ~= nil
-end
-
--- return the list of clusters which depends on a given member
-function find_cluster_memberships(member_id)
-    return reverse_cluster_index[member_id] or {}
-end
-
--- store the status of a cluster's member and its current alarms
-function set_member_status(cluster_id, member, value, alarms, hostname)
-    local cluster = clusters[cluster_id]
-    if cluster then
-        if cluster.group_by == 'hostname' and not hostname then
-            local err = string.format(
-                'Cannot update member status of cluster %s; ' ..
-                'group_by is set to "hostname" while input GSE/AFD message ' ..
-                'has no "hostname" field', cluster_id)
-            return false, err
-        end
-        cluster:update_fact(member, hostname, value, alarms)
-    end
-    return true
-end
-
--- The cluster status depends on the status of its members.
--- The status of the related clusters (defined by cluster.hints) doesn't modify
--- the overall status but their alarms are returned.
-function resolve_status(cluster_id)
-    local cluster = clusters[cluster_id]
-    assert(cluster)
-
-    cluster:refresh_status()
-    local alarms = table_utils.deepcopy(cluster.alarms)
-
-    if cluster.status ~= consts.OKAY then
-        -- add hints if the cluster isn't healthy
-        for _, other_id in ipairs(cluster.hints or {}) do
-            for _, v in pairs(cluster:subtract_alarms(clusters[other_id])) do
-                alarms[#alarms+1] = table_utils.deepcopy(v)
-                alarms[#alarms].tags['dependency_name'] = other_id
-                alarms[#alarms].tags['dependency_level'] = 'hint'
-            end
-        end
-    end
-
-    return cluster.status, alarms
-end
-
--- compute the cluster metric and inject it into the Heka pipeline
--- the metric's value is computed using the status of its members
-function inject_cluster_metric(cluster_name, dimensions, to_alerting)
-    local payload
-    local status, alarms = resolve_status(cluster_name)
-
-    if #alarms > 0 then
-        payload = lma.safe_json_encode({alarms=alarms})
-        if not payload then
-            return
-        end
-    else
-        -- because cjson encodes empty tables as objects instead of arrays
-        payload = '{"alarms":[]}'
-    end
-
-    local no_alerting
-    if to_alerting ~= nil and to_alerting == false then
-        no_alerting = true
-    end
-
-    local msg = {
-        Type = 'gse_metric',
-        Payload = payload,
-        Fields = {
-            name = 'cluster_status',
-            value = status,
-            member = cluster_name,
-            tag_fields = {'member'},
-            no_alerting = no_alerting,
-        }
-    }
-
-    for name, value in pairs(dimensions) do
-        table.insert(msg.Fields.tag_fields, name)
-        msg.Fields[name] = value
-    end
-
-    lma.inject_tags(msg)
-    lma.safe_inject_message(msg)
-end
-
-return M
diff --git a/heka/files/lua/common/gse_cluster.lua b/heka/files/lua/common/gse_cluster.lua
deleted file mode 100644
index cce94f4..0000000
--- a/heka/files/lua/common/gse_cluster.lua
+++ /dev/null
@@ -1,154 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local consts = require 'gse_constants'
-local gse_utils = require 'gse_utils'
-local table_utils = require 'table_utils'
-
-local ipairs = ipairs
-local pairs = pairs
-local setmetatable = setmetatable
-local assert = assert
-local type = type
-
-local GseCluster = {}
-GseCluster.__index = GseCluster
-
-setfenv(1, GseCluster) -- Remove external access to contain everything in the module
-
-local VALID_STATUSES = {
-    [consts.OKAY]=true,
-    [consts.WARN]=true,
-    [consts.CRIT]=true,
-    [consts.DOWN]=true,
-    [consts.UNKW]=true
-}
-
-function GseCluster.new(members, hints, group_by, policy_rules)
-    assert(type(members) == 'table')
-    assert(type(hints) == 'table')
-    assert(type(policy_rules) == 'table')
-
-    local cluster = {}
-    setmetatable(cluster, GseCluster)
-
-    cluster.members = members
-    cluster.hints = hints
-    cluster.policy_rules = policy_rules
-    -- when group_by is 'hostname', facts are stored by hostname then member
-    -- when group_by is 'member', facts are stored by member only
-    -- otherwise facts are stored by member then hostname
-    if group_by == 'hostname' or group_by == 'member' then
-        cluster.group_by = group_by
-    else
-        cluster.group_by = 'none'
-    end
-    cluster.status = consts.UNKW
-    cluster.facts = {}
-    cluster.alarms = {}
-    cluster.member_index = {}
-    for _, v in ipairs(members) do
-        cluster.member_index[v] = true
-    end
-
-    return cluster
-end
-
-function GseCluster:has_member(member)
-    return self.member_index[member]
-end
-
--- Update the facts table for a cluster's member
-function GseCluster:update_fact(member, hostname, value, alarms)
-    assert(VALID_STATUSES[value])
-    assert(type(alarms) == 'table')
-
-    local key1, key2 = member, hostname
-    if self.group_by == 'hostname' then
-        key1 = hostname
-        key2 = member
-    elseif self.group_by == 'member' then
-        key2 = '__anyhost__'
-    end
-
-    if not self.facts[key1] then
-        self.facts[key1] = {}
-    end
-    self.facts[key1][key2] = {
-        status=value,
-        alarms=table_utils.deepcopy(alarms),
-        member=member
-    }
-    if self.group_by == 'hostname' then
-        -- store the hostname for later reference in the alarms
-        self.facts[key1][key2].hostname = hostname
-    end
-end
-
--- Compute the status and alarms of the cluster according to the current facts
--- and the cluster's policy
-function GseCluster:refresh_status()
-    local alarms = {}
-    local status_breakdown = {}
-
-    self.status = consts.UNKW
-    self.alarms = {}
-
-    for group_key, _ in table_utils.orderedPairs(self.facts) do
-        local group_status = consts.UNKW
-        for sub_key, fact in table_utils.orderedPairs(self.facts[group_key]) do
-            group_status = gse_utils.max_status(group_status, fact.status)
-            if fact.status ~= consts.OKAY then
-                for _, v in ipairs(fact.alarms) do
-                    alarms[#alarms+1] = table_utils.deepcopy(v)
-                    if not alarms[#alarms]['tags'] then
-                        alarms[#alarms]['tags'] = {}
-                    end
-                    alarms[#alarms].tags['dependency_name'] = fact.member
-                    alarms[#alarms].tags['dependency_level'] = 'direct'
-                    if fact.hostname then
-                        alarms[#alarms].hostname = fact.hostname
-                    end
-                end
-            end
-        end
-        status_breakdown[group_status] = (status_breakdown[group_status] or 0) + 1
-    end
-    for _, policy_rule in ipairs(self.policy_rules) do
-        if policy_rule:evaluate(status_breakdown) then
-            self.status = policy_rule.status
-            break
-        end
-    end
-    if self.status ~= consts.OKAY then
-        self.alarms = alarms
-    end
-
-    return self.status
-end
-
--- Return the alarms from another cluster which aren't already known by this
--- cluster
-function GseCluster:subtract_alarms(cluster)
-    local subset = {}
-    if cluster then
-        for _, alarm in ipairs(cluster.alarms) do
-            if alarm.tags and alarm.tags['dependency_name'] and not self:has_member(alarm.tags['dependency_name']) then
-                subset[#subset+1] = alarm
-            end
-        end
-    end
-    return subset
-end
-
-return GseCluster
diff --git a/heka/files/lua/common/gse_constants.lua b/heka/files/lua/common/gse_constants.lua
deleted file mode 100644
index 2a328e6..0000000
--- a/heka/files/lua/common/gse_constants.lua
+++ /dev/null
@@ -1,39 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
--- The status values were chosen to match with the Grafana constraints:
--- OKAY => green
--- WARN & UNKW => orange
--- CRIT & DOWN => red
-OKAY=0
-WARN=1
-UNKW=2
-CRIT=3
-DOWN=4
-
-local STATUS_LABELS = {
-    [OKAY]='OKAY',
-    [WARN]='WARN',
-    [UNKW]='UNKNOWN',
-    [CRIT]='CRITICAL',
-    [DOWN]='DOWN'
-}
-
-function status_label(v)
-    return STATUS_LABELS[v]
-end
-
-return M
diff --git a/heka/files/lua/common/gse_policy.lua b/heka/files/lua/common/gse_policy.lua
deleted file mode 100644
index 6c7e52c..0000000
--- a/heka/files/lua/common/gse_policy.lua
+++ /dev/null
@@ -1,109 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local consts = require 'gse_constants'
-local gse_utils = require 'gse_utils'
-
-local assert = assert
-local ipairs = ipairs
-local pairs = pairs
-local setmetatable = setmetatable
-local string = string
-local tonumber = tonumber
-
-local GsePolicy = {}
-GsePolicy.__index = GsePolicy
-
-setfenv(1, GsePolicy) -- Remove external access to contain everything in the module
-
-local SEVERITIES = {
-    okay=consts.OKAY,
-    warning=consts.WARN,
-    unknown=consts.UNKW,
-    critical=consts.CRIT,
-    down=consts.DOWN
-}
-
-function GsePolicy.new(policy)
-    local p = {}
-    setmetatable(p, GsePolicy)
-
-    p.status = SEVERITIES[string.lower(policy.status)]
-    assert(p.status)
-
-    p.require_percent = false
-    p.rules = {}
-    if policy.trigger then
-        p.logical_op = string.lower(policy.trigger.logical_operator or 'or')
-        for _, r in ipairs(policy.trigger.rules or {}) do
-            assert(r['function'] == 'count' or r['function'] == 'percent')
-            if r['function'] == 'percent' then
-                p.require_percent = true
-            end
-            local rule = {
-                ['function']=r['function'],
-                relational_op=r.relational_operator,
-                threshold=tonumber(r.threshold),
-                arguments={}
-            }
-            for _, v in ipairs(r.arguments) do
-                assert(SEVERITIES[v])
-                rule.arguments[#rule.arguments+1] = SEVERITIES[v]
-            end
-            p.rules[#p.rules+1] = rule
-        end
-    end
-
-    return p
-end
-
--- return true or false depending on whether the facts match the policy
-function GsePolicy:evaluate(facts)
-    local total = 0
-
-    if #self.rules == 0 then
-        return true
-    end
-
-    if self.require_percent then
-        for _, v in pairs(facts) do
-            total = total + v
-        end
-    end
-
-    local one_match = false
-    for _, r in ipairs(self.rules) do
-        local value = 0
-        for _, status in ipairs(r.arguments) do
-            if facts[status] then
-                value = value + facts[status]
-            end
-        end
-        if r['function'] == 'percent' then
-            value = value * 100 / total
-        end
-
-        if gse_utils.compare_threshold(value, r.relational_op, r.threshold) then
-            one_match = true
-            if self.logical_op == 'or' then
-                return true
-            end
-        elseif self.logical_op == 'and' then
-            return false
-        end
-    end
-
-    return one_match
-end
-
-return GsePolicy
diff --git a/heka/files/lua/common/gse_utils.lua b/heka/files/lua/common/gse_utils.lua
deleted file mode 100644
index dd82aa2..0000000
--- a/heka/files/lua/common/gse_utils.lua
+++ /dev/null
@@ -1,58 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local consts = require 'gse_constants'
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-local STATUS_WEIGHTS = {
-    [consts.UNKW]=0,
-    [consts.OKAY]=1,
-    [consts.WARN]=2,
-    [consts.CRIT]=3,
-    [consts.DOWN]=4
-}
-
-function max_status(val1, val2)
-    if not val1 then
-        return val2
-    elseif not val2 then
-        return val1
-    elseif STATUS_WEIGHTS[val1] > STATUS_WEIGHTS[val2] then
-        return val1
-    else
-        return val2
-    end
-end
-
-function compare_threshold(value, op, threshold)
-    local rule_matches = false
-    if op == '==' or op == 'eq' then
-        rule_matches = value == threshold
-    elseif op == '!=' or op == 'ne' then
-        rule_matches = value ~= threshold
-    elseif op == '>=' or op == 'gte' then
-        rule_matches = value >= threshold
-    elseif op == '>' or op == 'gt' then
-        rule_matches = value > threshold
-    elseif op == '<=' or op == 'lte' then
-        rule_matches = value <= threshold
-    elseif op == '<' or op == 'lt' then
-        rule_matches = value < threshold
-    end
-    return rule_matches
-end
-
-return M
diff --git a/heka/files/lua/common/influxdb.lua b/heka/files/lua/common/influxdb.lua
deleted file mode 100644
index d9c359d..0000000
--- a/heka/files/lua/common/influxdb.lua
+++ /dev/null
@@ -1,114 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local string = string
-local table = table
-local setmetatable = setmetatable
-local ipairs = ipairs
-local pairs = pairs
-local tostring = tostring
-local type = type
-
-local utils = require 'lma_utils'
-
-local InfluxEncoder = {}
-InfluxEncoder.__index = InfluxEncoder
-
-setfenv(1, InfluxEncoder) -- Remove external access to contain everything in the module
-
-local function escape_string(str)
-    return tostring(str):gsub("([ ,])", "\\%1")
-end
-
-local function encode_scalar_value(value)
-    if type(value) == "number" then
-        -- Always send numbers as formatted floats, so InfluxDB will accept
-        -- them if they happen to change from ints to floats between
-        -- points in time.  Forcing them to always be floats avoids this.
-        return string.format("%.6f", value)
-    elseif type(value) == "string" then
-        -- string values need to be double quoted
-        return '"' .. value:gsub('"', '\\"') .. '"'
-    elseif type(value) == "boolean" then
-        return '"' .. tostring(value) .. '"'
-    end
-end
-
-local function encode_value(value)
-    if type(value) == "table" then
-        local values = {}
-        for k,v in pairs(value) do
-            table.insert(
-                values,
-                string.format("%s=%s", escape_string(k), encode_scalar_value(v))
-            )
-        end
-        return table.concat(values, ',')
-    else
-        return "value=" .. encode_scalar_value(value)
-    end
-end
-
--- Create a new InfluxDB encoder
---
--- time_precision: "s", "m", "ms", "us" or "ns" (default: "ns")
-function InfluxEncoder.new(time_precision)
-    local e = {}
-    setmetatable(e, InfluxEncoder)
-    e.time_precision = time_precision or 'ns'
-    return e
-end
-
--- Encode a single datapoint using the InfluxDB line protocol
---
--- timestamp: the timestamp in nanosecond
--- name:  the measurement's name
--- value: a scalar value or a list of key-value pairs
--- tags:  a list of key-value pairs encoded as InfluxDB tags
-function InfluxEncoder:encode_datapoint(timestamp, name, value, tags)
-    if timestamp == nil or type(name) ~= 'string' or value == nil or type(tags or {}) ~= 'table' then
-        -- fail silently if any input parameter is invalid
-        return ""
-    end
-
-    local ts = timestamp
-    if self.time_precision ~= 'ns' then
-        ts = utils.message_timestamp(self.time_precision, ts)
-    end
-
-    local tags_array = {}
-    for k,v in pairs(tags or {}) do
-        if k ~= '' and v ~= '' then
-            -- empty tag name and value aren't allowed by InfluxDB
-            table.insert(tags_array, escape_string(k) .. '=' .. escape_string(v))
-        end
-    end
-
-    if #tags_array > 0 then
-        -- for performance reasons, it is recommended to always send the tags
-        -- in the same order.
-        table.sort(tags_array)
-        return string.format("%s,%s %s %d",
-            escape_string(name),
-            table.concat(tags_array, ','),
-            encode_value(value),
-            ts)
-    else
-        return string.format("%s %s %d",
-            escape_string(name),
-            encode_value(value),
-            ts)
-    end
-end
-
-return InfluxEncoder
diff --git a/heka/files/lua/common/java_patterns.lua b/heka/files/lua/common/java_patterns.lua
deleted file mode 100644
index ce81818..0000000
--- a/heka/files/lua/common/java_patterns.lua
+++ /dev/null
@@ -1,42 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local dt     = require "date_time"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local tonumber = tonumber
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-local message   = l.Cg(patt.Message, "Message")
-
--- Complete grammars
-
--- Zookeeper
--- 2016-11-21 06:38:43,081 - INFO  [main:Environment@100] - Server environment:java.io.tmpdir=/tmp
-ZookeeperLogGrammar = l.Ct(patt.JavaTimestamp * patt.sp * patt.dash * patt.sp * patt.JavaSeverity * patt.sp^1 * message)
-
--- Cassandra
--- 2016-11-21 08:52:14,070 - DEBUG - run_command: nodetool -h 127.0.0.1 info | grep ID | awk '{print $3}'
-CassandraLogGrammar = l.Ct(patt.JavaTimestamp * patt.sp * patt.dash * patt.sp * patt.JavaSeverity * patt.sp^1 * patt.dash * patt.sp * message)
-
--- Ifmap
--- 2016-11-24 10:11:32,457 - TRACE - [main]  - MetadataTypeRepository: new MetadataType http://www.trustedcomputinggroup.org/2010/IFMAP-METADATA/2:discovered-by - singleValue
-IfmapLogGrammar = CassandraLogGrammar
-
-return M
diff --git a/heka/files/lua/common/lma_utils.lua b/heka/files/lua/common/lma_utils.lua
deleted file mode 100644
index e79f934..0000000
--- a/heka/files/lua/common/lma_utils.lua
+++ /dev/null
@@ -1,324 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local cjson = require 'cjson'
-local string = require 'string'
-local extra = require 'extra_fields'
-local patt  = require 'patterns'
-local math = require 'math'
-
-local pairs = pairs
-local inject_message = inject_message
-local inject_payload = inject_payload
-local read_message = read_message
-local pcall = pcall
-local type = type
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-severity_to_label_map = {
-    [0] = 'EMERGENCY',
-    [1] = 'ALERT',
-    [2] = 'CRITICAL',
-    [3] = 'ERROR',
-    [4] = 'WARNING',
-    [5] = 'NOTICE',
-    [6] = 'INFO',
-    [7] = 'DEBUG',
-}
-
-label_to_severity_map = {
-    EMERGENCY = 0,
-    E = 0,
-    FATAL = 0,
-    ALERT = 1,
-    A = 1,
-    CRITICAL = 2,
-    CRIT = 2,
-    SYS_CRIT = 2,
-    C = 2,
-    ERROR = 3,
-    E = 3,
-    WARNING = 4,
-    WARN = 4,
-    SYS_WARN = 4,
-    W = 4,
-    NOTICE = 5,
-    NOTE = 5,
-    N = 5,
-    SYS_NOTICE = 5,
-    INFO = 6,
-    SYS_INFO = 6,
-    I = 6,
-    DEBUG = 7,
-    D = 7,
-    TRACE = 7,
-}
-
-metric_type = {
-    COUNTER = "counter",
-    GAUGE = "gauge",
-    DERIVE = "derive",
-}
-
-local default_severity = 7
-
-local bulk_datapoints = {}
-
--- Add a datapoint to the bulk metric message
--- The 'value' parameter can be a table to support multi-value metric
-function add_to_bulk_metric(name, value, tags)
-    bulk_datapoints[#bulk_datapoints+1] = {
-        name = name,
-        tags = tags or {},
-    }
-    if type(value) == 'table' then
-        bulk_datapoints[#bulk_datapoints].values = value
-    else
-        bulk_datapoints[#bulk_datapoints].value = value
-    end
-end
-
--- Send the bulk metric message to the Heka pipeline
-function inject_bulk_metric(ts, hostname, source)
-    if #bulk_datapoints == 0 then
-        return
-    end
-
-    local payload = safe_json_encode(bulk_datapoints)
-    if not payload then
-        -- Reset the table otherwise it may grow infinitely and the sandbox
-        -- will eventually be killed by Heka.
-        -- See https://bugs.launchpad.net/lma-toolchain/+bug/1545743
-        bulk_datapoints = {}
-        return
-    end
-
-    local msg = {
-        Hostname = hostname,
-        Timestamp = ts,
-        Payload = payload,
-        Type = 'bulk_metric', -- prepended with 'heka.sandbox'
-        Severity = label_to_severity_map.INFO,
-        Fields = {
-            hostname = hostname,
-            source = source
-      }
-    }
-    -- reset the local table storing the datapoints
-    bulk_datapoints = {}
-
-    inject_tags(msg)
-    safe_inject_message(msg)
-end
-
--- Encode a Lua variable as JSON without raising an exception if the encoding
--- fails for some reason (for instance, the encoded buffer exceeds the sandbox
--- limit)
-function safe_json_encode(v)
-    local ok, data = pcall(cjson.encode, v)
-
-    if not ok then
-        return
-    end
-
-    return data
-end
-
--- Call inject_payload() wrapped by pcall()
-function safe_inject_payload(payload_type, payload_name, data)
-    local ok, err_msg = pcall(inject_payload, payload_type, payload_name, data)
-    if not ok then
-        return -1, err_msg
-    else
-        return 0
-    end
-end
-
--- Call inject_message() wrapped by pcall()
-function safe_inject_message(msg)
-    local ok, err_msg = pcall(inject_message, msg)
-    if not ok then
-        return -1, err_msg
-    else
-        return 0
-    end
-end
-
--- Parse a Syslog-based payload and update the Heka message
--- Return true if successful, false otherwise
-function parse_syslog_message(grammar, payload, msg)
-    -- capture everything after the first backslash because syslog_grammar will
-    -- drop it
-    local extra_msg = string.match(payload, '^[^\n]+\n(.+)\n$')
-
-    local fields = grammar:match(payload)
-    if not fields then
-        return false
-    end
-
-    msg.Timestamp = fields.timestamp
-    fields.timestamp = nil
-
-    msg.Hostname = fields.hostname
-    fields.hostname = nil
-
-    msg.Pid = fields.syslogtag.pid or 0
-    fields.programname = fields.syslogtag.programname
-    fields.syslogtag = nil
-
-    if fields.pri then
-        msg.Severity = fields.pri.severity
-        fields.syslogfacility = fields.pri.facility
-        fields.pri = nil
-    else
-        msg.Severity = fields.syslogseverity or fields["syslogseverity-text"]
-            or fields.syslogpriority or fields["syslogpriority-text"]
-            or default_severity
-        fields.syslogseverity = nil
-        fields["syslogseverity-text"] = nil
-        fields.syslogpriority = nil
-        fields["syslogpriority-text"] = nil
-    end
-    fields.severity_label = severity_to_label_map[msg.Severity]
-
-    if extra_msg ~= nil then
-        msg.Payload = fields.msg .. "\n" .. extra_msg
-    else
-        msg.Payload = fields.msg
-    end
-    fields.msg = nil
-
-    msg.Fields = fields
-
-    inject_tags(msg)
-
-    return true
-end
-
--- Inject tags into the Heka message
-function inject_tags(msg)
-    for k,v in pairs(extra.tags) do
-        if msg.Fields[k] == nil then
-            msg.Fields[k] = v
-        end
-    end
-end
-
--- Convert a datetime string to the RFC3339 format
--- it supports a variety of datetime formats.
--- Return the string unmodified if the datetime couldn't be parsed
-function format_datetime (raw_datetime)
-    local datetime
-    local t = patt.TimestampTable:match(raw_datetime)
-    if t then
-        local frac = 0
-        local offset_sign = '+'
-        local offset_hour = 0
-        local offset_min = 0
-        if t.sec_frac then frac = t.sec_frac end
-        if t.offset_sign then offset_sign = t.offset_sign end
-        if t.offset_hour then offset_hour = t.offset_hour end
-        if t.offset_min then offset_min = t.offset_min end
-        datetime = string.format("%04d-%02d-%02dT%02d:%02d:%02d.%06d%s%02d:%02d",
-            t.year, t.month, t.day, t.hour, t.min, t.sec, frac*1e6, offset_sign,
-            offset_hour, offset_min)
-    end
-    return datetime
-end
-
-function chomp(s)
-    return string.gsub(s, "\n$", "")
-end
-
-function truncate(str, max_length, delimiter)
-    if string.len(str) <= max_length then
-        return str
-    end
-
-    local pos = 1
-    while true do
-        local next_pos1, next_pos2 = string.find(str, delimiter, pos)
-        if not next_pos1 or next_pos1 - 1 > max_length then
-            pos = pos - string.len(delimiter) - 1
-            if pos < 1 then
-                pos = max_length
-            end
-            break
-        end
-        pos = next_pos2 + 1
-    end
-
-    return string.sub(str, 1, pos)
-end
-
--- Convert a nanosecond timestamp to a lower precision timestamp.
--- Arguments:
---   timestamp_precision: one of 'us', 'ms', 's', 'm' or 'h'.
---   timestamp: a timestamp in nanosecond, if not provided the message Timestamp is used.
-function message_timestamp(timestamp_precision, timestamp)
-    -- Default is to divide ns to ms
-    local timestamp_divisor = 1e6
-    -- Divide ns to s
-    if timestamp_precision == "s" then
-        timestamp_divisor = 1e9
-    -- Divide ns to us
-    elseif timestamp_precision == "us" then
-        timestamp_divisor = 1e3
-    -- Divide ns to m
-    elseif timestamp_precision == "m" then
-        timestamp_divisor = 1e9 * 60
-    -- Divide ns to h
-    elseif timestamp_precision == "h" then
-        timestamp_divisor = 1e9 * 60 * 60
-    end
-    if timestamp == nil then
-        timestamp = read_message("Timestamp")
-    end
-    return math.floor(timestamp / timestamp_divisor)
-end
-
--- Extract the metric value(s) from the message.
--- The value can be either a scalar value or a table for mulitvalue metrics.
--- Returns true plus the value or if it fails, returns false plus the error message.
-function get_values_from_metric()
-    if read_message('Fields[value_fields]') then
-        value = {}
-        local i = 0
-        local val
-        while true do
-            local f = read_message("Fields[value_fields]", 0, i)
-            if not f then
-                break
-            end
-            val = read_message(string.format('Fields[%s]', f))
-            if val ~= nil then
-                value[f] = val
-                i = i + 1
-            end
-        end
-        if i == 0 then
-           return false, 'Fields[value_fields] does not list any valid field'
-        end
-    else
-        value = read_message("Fields[value]")
-        if not value then
-            return false, 'Fields[value] is missing'
-        end
-    end
-
-    return true, value
-end
-
-return M
diff --git a/heka/files/lua/common/patterns.lua b/heka/files/lua/common/patterns.lua
deleted file mode 100644
index 09be695..0000000
--- a/heka/files/lua/common/patterns.lua
+++ /dev/null
@@ -1,156 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local table  = require 'table'
-local dt     = require "date_time"
-local l      = require 'lpeg'
-l.locale(l)
-
-local tonumber = tonumber
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-function format_uuid(t)
-    return table.concat(t, '-')
-end
-
-function anywhere (patt)
-  return l.P {
-    patt + 1 * l.V(1)
-  }
-end
-
-sp = l.space
-colon = l.P":"
-dash = l.P"-"
-dot = l.P'.'
-quote = l.P'"'
-
-local x4digit = l.xdigit * l.xdigit * l.xdigit * l.xdigit
-local uuid_dash = l.C(x4digit * x4digit * dash * x4digit * dash * x4digit * dash * x4digit * dash * x4digit * x4digit * x4digit)
-local uuid_nodash = l.Ct(l.C(x4digit * x4digit) * l.C(x4digit) * l.C(x4digit) * l.C(x4digit) * l.C(x4digit * x4digit * x4digit)) / format_uuid
-
--- Return a UUID string in canonical format (eg with dashes)
-Uuid = uuid_nodash + uuid_dash
-
--- Parse a datetime string and return a table with the following keys
---   year (string)
---   month (string)
---   day (string)
---   hour (string)
---   min (string)
---   sec (string)
---   sec_frac (number less than 1, can be nil)
---   offset_sign ('-' or '+', can be nil)
---   offset_hour (number, can be nil)
---   offset_min (number, can be nil)
---
--- The datetime string can be formatted as
--- 'YYYY-MM-DD( |T)HH:MM:SS(.ssssss)?(offset indicator)?'
-TimestampTable = l.Ct(dt.rfc3339_full_date * (sp + l.P"T") * dt.rfc3339_partial_time * (dt.rfc3339_time_offset + dt.timezone_offset)^-1)
-
--- Returns the parsed datetime converted to nanosec
-Timestamp = TimestampTable / dt.time_to_ns
-
-programname   = (l.R("az", "AZ", "09") + l.P"." + dash + l.P"_")^1
-Pid           = l.digit^1
-SeverityLabel = l.P"CRITICAL" + l.P"ERROR" + l.P"WARNING" + l.P"INFO" + l.P"AUDIT" + l.P"DEBUG" + l.P"TRACE"
-Message       = l.P(1)^0
-
--- Capture for OpenStack logs producing four values: Timestamp, Pid,
--- SeverityLabel, PythonModule and Message.
---
--- OpenStack log messages are of this form:
--- 2015-11-30 08:38:59.306 3434 INFO oslo_service.periodic_task [-] Blabla...
---
--- [-] is the "request" part, it can take multiple forms. See below.
-openstack = l.Ct(l.Cg(Timestamp, "Timestamp")* sp * l.Cg(Pid, "Pid") * sp *
-    l.Cg(SeverityLabel, "SeverityLabel") * sp * l.Cg(programname, "PythonModule") *
-    sp * l.Cg(Message, "Message"))
-
--- Capture for OpenStack request context producing three values: RequestId,
--- UserId and TenantId.
---
--- Notes:
---
--- OpenStack logs include a request context, enclosed between square brackets.
--- It takes one of these forms:
---
--- [-]
--- [req-0fd2a9ba-448d-40f5-995e-33e32ac5a6ba - - - - -]
--- [req-4db318af-54c9-466d-b365-fe17fe4adeed 8206d40abcc3452d8a9c1ea629b4a8d0 112245730b1f4858ab62e3673e1ee9e2 - - -]
---
--- In the 1st case the capture produces nil.
--- In the 2nd case the capture produces one value: RequestId.
--- In the 3rd case the capture produces three values: RequestId, UserId, TenantId.
---
--- The request id  may be formatted as 'req-xxx' or 'xxx' depending on the project.
--- The user id and tenant id may not be present depending on the OpenStack release.
-openstack_request_context = (l.P(1) - "[" )^0 * "[" * l.P"req-"^-1 *
-    l.Ct(l.Cg(Uuid, "RequestId") * sp * ((l.Cg(Uuid, "UserId") * sp *
-    l.Cg(Uuid, "TenantId")) + l.P(1)^0)) - "]"
-
-local http_method = l.Cg(l.R"AZ"^3, "http_method")
-local url = l.Cg( (1 - sp)^1, "http_url")
-local http_version = l.Cg(l.digit * dot * l.digit, "http_version")
-
--- Pattern for the "<http_method> <http_url> HTTP/<http_version>" format found
--- found in both OpenStack and Apache log files.
--- Example : OPTIONS /example.com HTTP/1.0
-http_request = http_method * sp * url * sp * l.P'HTTP/' * http_version
-
--- Patterns for HTTP status, HTTP response size and HTTP response time in
--- OpenLayers logs.
---
--- Notes:
--- Nova changes the default log format of eventlet.wsgi (see nova/wsgi.py) and
--- prefixes the HTTP status, response size and response time values with
--- respectively "status: ", "len: " and "time: ".
--- Other OpenStack services just rely on the default log format.
--- TODO(pasquier-s): build the LPEG grammar based on the log_format parameter
--- passed to eventlet.wsgi.server similar to what the build_rsyslog_grammar
--- function does for RSyslog.
-local openstack_http_status = l.P"status: "^-1 * l.Cg(l.digit^3, "http_status")
-local openstack_response_size = l.P"len: "^-1 * l.Cg(l.digit^1 / tonumber, "http_response_size")
-local openstack_response_time = l.P"time: "^-1 * l.Cg(l.digit^1 * dot^0 * l.digit^0 / tonumber, "http_response_time")
-
--- Capture for OpenStack HTTP producing six values: http_method, http_url,
--- http_version, http_status, http_response_size and http_response_time.
-openstack_http = anywhere(l.Ct(
-    quote * http_request * quote * sp^1 *
-    openstack_http_status * sp^1 * openstack_response_size * sp^1 *
-    openstack_response_time
-))
-
--- Capture for IP addresses producing one value: ip_address.
-ip_address = anywhere(l.Ct(
-    l.Cg(l.digit^-3 * dot * l.digit^-3 * dot * l.digit^-3 * dot * l.digit^-3, "ip_address")
-))
-
--- Pattern used to match the beginning of a Python Traceback.
-traceback = l.P'Traceback (most recent call last):'
-
--- Pattern used to match a number
-Number = l.P"-"^-1 * l.xdigit^1 * (l.S(".,") * l.xdigit^1 )^-1 / tonumber
-
--- Java/Log4J Timestamp patterns
--- 2016-11-21 06:38:43,081 - INFO 
-local time_secfrac = l.Cg(l.P"," * l.digit^1 / tonumber, "sec_frac")
-local ts_grammar = l.Ct(dt.date_fullyear * dash * dt.date_month * dash * dt.date_mday * sp * dt.rfc3339_partial_time * time_secfrac)
-JavaTimestamp = l.Cg(ts_grammar / dt.time_to_ns, "Timestamp")
-
--- Java Severity
-JavaSeverity = l.Cg(SeverityLabel + l.P"WARN" + l.P"FATAL", "SeverityLabel")
-
-return M
diff --git a/heka/files/lua/common/redis_patterns.lua b/heka/files/lua/common/redis_patterns.lua
deleted file mode 100644
index ea879e3..0000000
--- a/heka/files/lua/common/redis_patterns.lua
+++ /dev/null
@@ -1,58 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local dt     = require "date_time"
-local l      = require 'lpeg'
-local os     = require 'os'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
--- Redis logs do not provide year in output
-local function extend_date (t)
-    if t['year'] == nil then
-       t['year'] = os.date("*t").year
-    end
-    return dt.time_to_ns(t)
-end
-
-local message   = l.Cg(patt.Message / utils.chomp, "Message")
-
--- Common patterns
-local delim = (l.P"#" + l.P"*")^1
-
--- [11633 | signal handler] (1479710114) Received SIGTERM, scheduling shutdown...
--- value between parenthesis is timestamp
-
--- [11633] 21 Nov 06:35:14.648 [#*] blabla
-local redis_pid = l.P"[" * l.Cg(l.digit^1, "Pid") * l.P"]"
-local redis_sig_pid = l.P"[" * l.Cg(l.digit^1, "Pid") * patt.sp * l.P"| signal handler]"
-
--- Timestamp patterns
--- [11633] 21 Nov 06:35:14.648 [#*] blabla
-local ts_grammar = l.Ct(dt.date_mday * patt.sp * dt.date_mabbr * patt.sp * dt.rfc3339_partial_time)
-local redis_sig_timestamp = l.Cg(dt.build_strftime_grammar("(%s)") / dt.time_to_ns, "Timestamp")
-local redis_std_timestamp = l.Cg(ts_grammar / extend_date, "Timestamp")
-
--- Complete grammars
--- [11633] 21 Nov 06:35:00.925 [#*] blabla
--- [11633 | signal handler] (1479710114) Received SIGTERM, scheduling shutdown...
-std_grammar = l.Ct(redis_pid * patt.sp * redis_std_timestamp * patt.sp * delim * patt.sp * message)
-sig_grammar = l.Ct(redis_sig_pid * patt.sp * redis_sig_timestamp * patt.sp * message)
-LogGrammar = std_grammar + sig_grammar
-
-return M
diff --git a/heka/files/lua/common/resources.lua b/heka/files/lua/common/resources.lua
deleted file mode 100644
index 465585b..0000000
--- a/heka/files/lua/common/resources.lua
+++ /dev/null
@@ -1,121 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-local cjson = cjson
-local string = string
-local table = table
-local math = math
-local setmetatable = setmetatable
-local ipairs = ipairs
-local pairs = pairs
-local pcall = pcall
-local type = type
-
-local patt = require 'patterns'
-local utils = require 'lma_utils'
-local l = require 'lpeg'
-l.locale(l)
-
-function normalize_uuid(uuid)
-    return patt.Uuid:match(uuid)
-end
-
-local metadata_fields = {}
-
-local ResourcesDecoder = {}
-ResourcesDecoder.__index = ResourcesDecoder
-
-setfenv(1, ResourcesDecoder) -- Remove external access to contain everything in the module
-
-function normalize_uuid(uuid)
-    return patt.Uuid:match(uuid)
-end
-
--- Mapping table defining transformation functions to be applied, keys are the
--- attributes in the notification's payload and values are Lua functions
-local transform_functions = {
-    created_at = utils.format_datetime,
-    launched_at = utils.format_datetime,
-    deleted_at = utils.format_datetime,
-    terminated_at = utils.format_datetime,
-    user_id = normalize_uuid,
-    project_id = normalize_uuid,
-}
-
-function map(func, tbl)
-     local mapped_table = {}
-     for i,v in pairs(tbl) do
-         mapped_table[i] = func(v)
-     end
-     return mapped_table
-end
-
-local resource_msg = {
-    Timestamp = nil,
-    Type = "ceilometer_resources",
-    Payload = nil
-}
-
-function add_resource_to_payload(sample, payload)
-    local counter_name, _ = string.gsub(sample.counter_name, "%.", "\\")
-
-    local resource_data = {
-        timestamp = sample.timestamp,
-        resource_id = sample.resource_id,
-        source = sample.source or "",
-        metadata = sample.resource_metadata,
-        user_id = sample.user_id,
-        project_id = sample.project_id,
-        meter = {
-            [counter_name] = {
-                type = sample.counter_type,
-                unit = sample.counter_unit
-            }
-        }
-    }
-    payload[sample.resource_id] = resource_data
-end
-
-function ResourcesDecoder.new()
-    local e = {}
-    setmetatable(e, ResourcesDecoder)
-    return e
-end
-
--- Decode Ceilometer samples to resource messages
-
--- data: oslo.messaging message with Ceilometer samples
--- returns ok and resource or error message
-function ResourcesDecoder:decode (data)
-    local ok, message = pcall(cjson.decode, data)
-    if not ok then
-        return -2, "Cannot decode Payload"
-    end
-    local ok, message_body = pcall(cjson.decode, message["oslo.message"])
-    if not ok then
-        return -2, "Cannot decode Payload[oslo.message]"
-    end
-    local resource_payload = {}
-    if message_body['payload'] then
-        for _, sample in ipairs(message_body["payload"]) do
-            add_resource_to_payload(sample, resource_payload)
-        end
-        resource_msg.Payload = cjson.encode(resource_payload)
-        resource_msg.Timestamp = patt.Timestamp:match(message_body.timestamp)
-        return 0, resource_msg
-    end
-    return -2, "Empty message"
-end
-
-return ResourcesDecoder
diff --git a/heka/files/lua/common/samples.lua b/heka/files/lua/common/samples.lua
deleted file mode 100644
index 0516e8f..0000000
--- a/heka/files/lua/common/samples.lua
+++ /dev/null
@@ -1,194 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-local cjson = cjson
-local string = string
-local table = table
-local math = math
-local setmetatable = setmetatable
-local ipairs = ipairs
-local pairs = pairs
-local pcall = pcall
-local type = type
-
-local patt = require 'patterns'
-local utils = require 'lma_utils'
-local l = require 'lpeg'
-l.locale(l)
-
-function normalize_uuid(uuid)
-    return patt.Uuid:match(uuid)
-end
-
-local metadata_fields = {}
-
-local SamplesDecoder = {}
-SamplesDecoder.__index = SamplesDecoder
-
-setfenv(1, SamplesDecoder) -- Remove external access to contain everything in the module
-
-function normalize_uuid(uuid)
-    return patt.Uuid:match(uuid)
-end
-
--- Mapping table defining transformation functions to be applied, keys are the
--- attributes in the notification's payload and values are Lua functions
-local transform_functions = {
-    created_at = utils.format_datetime,
-    launched_at = utils.format_datetime,
-    deleted_at = utils.format_datetime,
-    terminated_at = utils.format_datetime,
-    user_id = normalize_uuid,
-    project_id = normalize_uuid,
-}
-
-function map(func, tbl)
-     local mapped_table = {}
-     for i,v in pairs(tbl) do
-         mapped_table[i] = func(v)
-     end
-     return mapped_table
-end
-
-local sample_msg = {
-    Timestamp = nil,
-    -- This message type has the same structure than 'bulk_metric'.
-    Type = "ceilometer_samples",
-    Payload = nil
-}
-
-function parse_metadata_field(field)
-    local from = 1
-    local to = string.find(field, "%.")
-    if to ~= nil then
-        local field_t = {}
-        while to do
-            table.insert(field_t, string.sub(field, from, to - 1))
-            from = to + 1
-            to = string.find(field, "%.", from)
-        end
-        table.insert(field_t, string.sub(field, from))
-        return field_t
-    else
-        return field
-    end
-
-end
-
-function parse_metadata_fields(fields)
-    local parsed_fields = {}
-    for _, field in ipairs(fields) do
-        parsed_fields[field] = parse_metadata_field(field)
-    end
-    return parsed_fields
-end
-
-function get_field(field, metadata)
-    local value = nil
-    if type(metadata) == 'table' then
-        if type(field) == 'table' then
-            value = metadata
-            for _, field_part in ipairs(field) do
-                if not value then
-                    break
-                end
-                value = value[field_part]
-            end
-        else
-            value = metadata[field]
-        end
-    end
-    return value
-end
-
-
-function SamplesDecoder:inject_metadata(metadata, tags)
-    local value
-    for field_name, field_tbl in pairs(self.metadata_fields) do
-        value = get_field(field_tbl, metadata)
-        if value ~= nil and type(value) ~= 'table' then
-            local transform = transform_functions[field_name]
-            if transform ~= nil then
-                tags["metadata." .. field_name] = transform(value)
-            else
-                tags["metadata." .. field_name] = value
-            end
-        end
-    end
-end
-
-function SamplesDecoder:add_sample_to_payload(sample, payload)
-    local sample_data = {
-        name='sample',
-        timestamp = patt.Timestamp:match(sample.timestamp),
-        values = {
-            value = sample.counter_volume,
-            message_id = sample.message_id,
-            recorded_at = sample.recorded_at,
-            timestamp = sample.timestamp,
-            message_signature = sample.signature,
-            type = sample.counter_type,
-            unit = sample.counter_unit
-        }
-    }
-    local tags = {
-        meter = sample.counter_name,
-        resource_id = sample.resource_id,
-        project_id = sample.project_id ,
-        user_id = sample.user_id,
-        source = sample.source
-    }
-    self:inject_metadata(sample.resource_metadata or {}, tags)
-    sample_data["tags"] = tags
-    table.insert(payload, sample_data)
-end
-
--- Create a new Sample decoder
---
--- metadata fields: line with metadata fields to store
--- from samples separated by space
-function SamplesDecoder.new(metadata_fields)
-    local e = {}
-    setmetatable(e, SamplesDecoder)
-    e.metadata_fields = parse_metadata_fields(metadata_fields)
-    return e
-end
-
-
--- Decode Ceilometer samples
-
--- data: oslo.messaging message with Ceilometer samples
--- returns ok and sample or error message
-function SamplesDecoder:decode (data)
-    local ok, message = pcall(cjson.decode, data)
-    if not ok then
-        return -2, "Cannot decode Payload"
-    end
-    local ok, message_body = pcall(cjson.decode, message["oslo.message"])
-    if not ok then
-        return -2, "Cannot decode Payload[oslo.message]"
-    end
-    local sample_payload = {}
-    if message_body['payload'] then
-        for _, sample in ipairs(message_body["payload"]) do
-            self:add_sample_to_payload(sample, sample_payload)
-        end
-        sample_msg.Payload = cjson.encode(sample_payload)
-        sample_msg.Timestamp = patt.Timestamp:match(message_body.timestamp)
-        return 0, sample_msg
-    end
-    return -2, "Empty message"
-end
-
-return SamplesDecoder
diff --git a/heka/files/lua/common/table_utils.lua b/heka/files/lua/common/table_utils.lua
deleted file mode 100644
index ba5fb93..0000000
--- a/heka/files/lua/common/table_utils.lua
+++ /dev/null
@@ -1,109 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local table = require 'table'
-local pairs = pairs
-local ipairs = ipairs
-local type = type
-
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
--- return a clone of the passed table
-function deepcopy(t)
-    if type(t) == 'table' then
-        local copy = {}
-        for k, v in pairs(t) do
-            copy[k] = deepcopy(v)
-        end
-        return copy
-    end
-    return t
-end
-
--- return the position (index) of an item in a list, nil if not found
-function item_pos(item, list)
-  if type(list) == 'table' then
-    for i, v in ipairs(list) do
-      if v == item then
-        return i
-      end
-    end
-  end
-end
-
--- return true if an item is present in the list, false otherwise
-function item_find(item, list)
-    return item_pos(item, list) ~= nil
-end
-
--- from http://lua-users.org/wiki/SortedIteration
-function __genOrderedIndex( t )
-    local orderedIndex = {}
-    for key in pairs(t) do
-        table.insert( orderedIndex, key )
-    end
-    table.sort( orderedIndex )
-    return orderedIndex
-end
-
-function orderedNext(t, state)
-    -- Equivalent of the next function, but returns the keys in the alphabetic
-    -- order. We use a temporary ordered key table that is stored in the
-    -- table being iterated.
-
-    key = nil
-    if state == nil then
-        -- the first time, generate the index
-        t.__orderedIndex = __genOrderedIndex( t )
-        key = t.__orderedIndex[1]
-    else
-        -- fetch the next value
-        for i = 1,table.getn(t.__orderedIndex) do
-            if t.__orderedIndex[i] == state then
-                key = t.__orderedIndex[i+1]
-            end
-        end
-    end
-
-    if key then
-        return key, t[key]
-    end
-
-    -- no more value to return, cleanup
-    t.__orderedIndex = nil
-    return
-end
-
-function orderedPairs(t)
-    -- Equivalent of the pairs() function on tables. Allows to iterate
-    -- in order
-    return orderedNext, t, nil
-end
-
--- Shallow comparison between two tables.
--- Return true if the two tables have the same keys with identical
--- values, otherwise false.
-function table_equal(t1, t2)
-    -- all key-value pairs in t1 must be in t2
-    for k, v in pairs(t1) do
-        if t2[k] ~= v then return false end
-    end
-    -- there must not be other keys in t2
-    for k, v in pairs(t2) do
-        if t1[k] == nil then return false end
-    end
-    return true
-end
-
-return M
diff --git a/heka/files/lua/common/value_matching.lua b/heka/files/lua/common/value_matching.lua
deleted file mode 100644
index 152425e..0000000
--- a/heka/files/lua/common/value_matching.lua
+++ /dev/null
@@ -1,171 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-local l = require "lpeg"
-l.locale(l)
-local pcall = pcall
-local string = require 'string'
-
-local patterns = require 'patterns'
-local error = error
-local setmetatable = setmetatable
-local tonumber = tonumber
-
-local C = l.C
-local P = l.P
-local S = l.S
-local V = l.V
-local Ct = l.Ct
-local Cc = l.Cc
-
-local Optional_space = patterns.sp^0
-local Only_spaces = patterns.sp^1 * -1
-
-local function space(pat)
-    return Optional_space * pat * Optional_space
-end
-
-local EQ = P'=='
-local NEQ = P'!='
-local GT = P'>'
-local LT = P'<'
-local GTE = P'>='
-local LTE = P'<='
-local MATCH = P'=~'
-local NO_MATCH = P'!~'
-
-local OR = P'||'
-local AND = P'&&'
-
-local function get_operator(op)
-    if op == '' then
-        return '=='
-    end
-    return op
-end
-
-local numerical_operator = (EQ + NEQ + LTE + GTE + GT + LT )^-1 / get_operator
-local sub_numerical_expression = space(numerical_operator) * patterns.Number * Optional_space
-local is_plain_numeric = (sub_numerical_expression * ((OR^1 + AND^1) * sub_numerical_expression)^0) * -1
-
-local quoted_string = (P'"' * C((P(1) - (P'"'))^1) * P'"' + C((P(1) - patterns.sp)^1))
-local string_operator = (EQ + NEQ + MATCH + NO_MATCH)^-1 / get_operator
-local sub_string_expression = space(string_operator) * quoted_string * Optional_space
-local is_plain_string = (sub_string_expression * ((OR^1 + AND^1) * sub_string_expression)^0) * -1
-
-local numerical_expression = P {
-    'OR';
-    AND = Ct(Cc('and') * V'SUB' * space(AND) * V'AND' + V'SUB'),
-    OR = Ct(Cc('or') * V'AND' * space(OR) * V'OR' + V'AND'),
-    SUB = Ct(sub_numerical_expression)
-} * -1
-
-local string_expression = P {
-    'OR';
-    AND = Ct(Cc('and') * V'SUB' * space(AND) * V'AND' + V'SUB'),
-    OR = Ct(Cc('or') * V'AND' * space(OR) * V'OR' + V'AND'),
-    SUB = Ct(sub_string_expression)
-} * -1
-
-local is_complex = patterns.anywhere(EQ + NEQ + LTE + GTE + GT + LT + MATCH + NO_MATCH + OR + AND)
-
-local function eval_tree(tree, value)
-    local match = false
-
-    if type(tree[1]) == 'table' then
-        match = eval_tree(tree[1], value)
-    else
-        local operator = tree[1]
-        if operator == 'and' or operator == 'or' then
-            match = eval_tree(tree[2], value)
-            for i=3, #tree, 1 do
-                local m = eval_tree(tree[i], value)
-                if operator == 'or' then
-                    match = match or m
-                else
-                    match = match and m
-                end
-            end
-        else
-            local matcher = tree[2]
-            if operator == '==' then
-                return value == matcher
-            elseif operator == '!=' then
-                return value ~= matcher
-            elseif operator == '>' then
-                return value > matcher
-            elseif operator == '<' then
-                return value < matcher
-            elseif operator == '>=' then
-                return value >= matcher
-            elseif operator == '<=' then
-                return value <= matcher
-            elseif operator == '=~' then
-                local ok, m = pcall(string.find, value, matcher)
-                return ok and m ~= nil
-            elseif operator == '!~' then
-                local ok, m = pcall(string.find, value, matcher)
-                return ok and m == nil
-            end
-        end
-    end
-    return match
-end
-
-local MatchExpression = {}
-MatchExpression.__index = MatchExpression
-
-setfenv(1, MatchExpression) -- Remove external access to contain everything in the module
-
-function MatchExpression.new(expression)
-    local r = {}
-    setmetatable(r, MatchExpression)
-    if is_complex:match(expression) then
-        r.is_plain_numeric_exp = is_plain_numeric:match(expression) ~= nil
-
-        if r.is_plain_numeric_exp then
-            r.tree = numerical_expression:match(expression)
-        elseif is_plain_string:match(expression) ~= nil then
-            r.tree = string_expression:match(expression)
-        end
-        if r.tree == nil then
-            error('Invalid expression: ' .. expression)
-        end
-    else
-        if expression == '' or Only_spaces:match(expression) then
-            error('Expression is empty')
-        end
-        r.is_simple_equality_matching = true
-    end
-    r.expression = expression
-
-    return r
-end
-
-function MatchExpression:matches(value)
-    if self.is_simple_equality_matching then
-        return self.expression == value or
-                tonumber(self.expression) == value or
-                tonumber(value) == self.expression
-    end
-    if self.is_plain_numeric_exp then
-        value = tonumber(value)
-        if value == nil then
-            return false
-        end
-    end
-    return eval_tree(self.tree, value)
-end
-
-return MatchExpression
diff --git a/heka/files/lua/decoders/cassandra.lua b/heka/files/lua/decoders/cassandra.lua
deleted file mode 100644
index 7a80b9f..0000000
--- a/heka/files/lua/decoders/cassandra.lua
+++ /dev/null
@@ -1,46 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-local utils  = require 'lma_utils'
-l.locale(l)
-
-local java   = require 'java_patterns'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 6,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = java.CassandraLogGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Pid = m.Pid
-    msg.Severity = utils.label_to_severity_map[m.SeverityLabel or 'INFO'] or 6
-    msg.Fields = {}
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    msg.Fields.programname = 'cassandra'
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/collectd.lua b/heka/files/lua/decoders/collectd.lua
deleted file mode 100644
index 085821c..0000000
--- a/heka/files/lua/decoders/collectd.lua
+++ /dev/null
@@ -1,492 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "string"
-require "cjson"
-
-local utils = require 'lma_utils'
-
-local sep = '_'
-
-local processes_map = {
-    ps_code = 'memory_code',
-    ps_count = '',
-    ps_cputime = 'cputime',
-    ps_data = 'memory_data',
-    ps_disk_octets = 'disk_bytes',
-    ps_disk_ops = 'disk_ops',
-    ps_pagefaults = 'pagefaults',
-    ps_rss = 'memory_rss',
-    ps_stacksize = 'stacksize',
-    ps_vm = 'memory_virtual',
-}
-
--- The following table keeps a list of metrics from plugin where the
--- hostname is not relevant.
-local hostname_free = {
-    -- Add "metric_source = true" to skip the hostname for all metrics
-    -- from the metric_source
-    -- Add "metric_source = { list of metrics } to skip hostname for a
-    -- subset of metrics. The list of metrics is referenced through the
-    -- field 'type_instance'.
-    hypervisor_stats = {
-        total_free_disk_GB = true,
-        total_free_ram_MB = true,
-        total_free_vcpus = true,
-        total_used_disk_GB = true,
-        total_used_ram_MB = true,
-        total_used_vcpus = true,
-        total_running_instances = true,
-        total_running_tasks = true,
-    },
-    check_openstack_api = true,
-    http_check = true,
-}
-
--- this is needed for the libvirt metrics because in that case, collectd sends
--- the instance's ID instead of the hostname in the 'host' attribute
-local hostname = read_config('hostname') or error('hostname must be specified')
-local swap_size = (read_config('swap_size') or 0) + 0
-
-function replace_dot_by_sep (str)
-    return string.gsub(str, '%.', sep)
-end
-
-function process_message ()
-    local ok, samples = pcall(cjson.decode, read_message("Payload"))
-    if not ok then
-        -- TODO: log error
-        return -1
-    end
-
-    for _, sample in ipairs(samples) do
-        local metric_prefix = sample['type']
-        if sample['type_instance'] ~= "" then
-            metric_prefix = metric_prefix .. sep .. sample['type_instance']
-        end
-
-        local metric_source = sample['plugin']
-
-        for i, value in ipairs(sample['values']) do
-            local skip_it = false
-            local metric_name = metric_prefix
-            if sample['dsnames'][i] ~= "value" then
-                metric_name = metric_name .. sep .. sample['dsnames'][i]
-            end
-
-            local msg = {
-                Timestamp = sample['time'] * 1e9, -- Heka expects nanoseconds
-                Hostname = sample['host'],
-                Logger = "collectd",
-                Payload = utils.safe_json_encode(sample) or '',
-                Severity = 6,
-                Type = "metric",
-                Fields = {
-                    interval = sample['interval'],
-                    source =  metric_source,
-                    type =  sample['dstypes'][i],
-                    value =  value,
-                    tag_fields = {},
-                }
-            }
-
-            -- Normalize metric name, unfortunately collectd plugins aren't
-            -- always consistent on metric namespaces so we need a few if/else
-            -- statements to cover all cases.
-
-            -- Check if hostname is needed or not
-            local add_hostname = true
-            if hostname_free[metric_source] == true then
-                add_hostname = false
-            elseif hostname_free[metric_source] and
-                hostname_free[metric_source][sample['type_instance']] then
-                add_hostname = false
-            end
-
-            if add_hostname then
-                msg['Fields']['hostname'] = sample['host']
-                table.insert(msg['Fields']['tag_fields'], 'hostname')
-            end
-
-            if sample['meta'] and sample['meta']['service_check'] then
-                msg['Fields']['name'] = sample['meta']['service_check'] .. sep .. 'check'
-                msg['Fields']['details'] = sample['meta']['failure']
-            elseif metric_source == 'memory' or metric_source == 'contextswitch' or
-                   metric_source == 'entropy' or metric_source == 'load' or
-                   metric_source == 'swap' or metric_source == 'uptime' then
-                msg['Fields']['name'] = metric_name
-            elseif metric_source == 'df' then
-                local entity
-                if sample['type'] == 'df_inodes' then
-                    entity = 'inodes'
-                elseif sample['type'] == 'percent_inodes' then
-                    entity = 'inodes_percent'
-                elseif sample['type'] == 'percent_bytes' then
-                    entity = 'space_percent'
-                else -- sample['type'] == 'df_complex'
-                    entity = 'space'
-                end
-
-                local mount = sample['plugin_instance']
-                if mount == 'root' then
-                    mount  = '/'
-                else
-                    mount = '/' .. mount:gsub('-', '/')
-                end
-
-                msg['Fields']['name'] = 'fs' .. sep .. entity .. sep .. sample['type_instance']
-                msg['Fields']['fs'] = mount
-                table.insert(msg['Fields']['tag_fields'], 'fs')
-            elseif metric_source == 'disk' then
-                if sample['type'] == 'disk_io_time' then
-                    msg['Fields']['name'] = 'disk' .. sep .. sample['dsnames'][i]
-                else
-                    msg['Fields']['name'] = metric_name
-                end
-                msg['Fields']['device'] = sample['plugin_instance']
-                table.insert(msg['Fields']['tag_fields'], 'device')
-            elseif metric_source == 'cpu' then
-                msg['Fields']['name'] = 'cpu' .. sep .. sample['type_instance']
-                msg['Fields']['cpu_number'] = sample['plugin_instance']
-                table.insert(msg['Fields']['tag_fields'], 'cpu_number')
-            elseif metric_source == 'netlink' then
-                local netlink_metric = sample['type']
-                if netlink_metric == 'if_rx_errors' then
-                    netlink_metric = 'if_errors_rx'
-                elseif netlink_metric == 'if_tx_errors' then
-                    netlink_metric = 'if_errors_tx'
-                end
-
-                -- Netlink plugin can send one or two values. Use dsnames only when needed.
-                if sample['dsnames'][i] ~= 'value' then
-                    netlink_metric = netlink_metric .. sep .. sample['dsnames'][i]
-                end
-                -- and type of errors is set in type_instance
-                if sample['type_instance'] ~= '' then
-                    netlink_metric = netlink_metric .. sep .. sample['type_instance']
-                end
-                msg['Fields']['name'] = netlink_metric
-                msg['Fields']['interface'] = sample['plugin_instance']
-                table.insert(msg['Fields']['tag_fields'], 'interface')
-            elseif metric_source == 'processes' then
-                if processes_map[sample['type']] then
-                    -- metrics related to a specific process
-                    msg['Fields']['service'] = sample['plugin_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'service')
-                    msg['Fields']['name'] = 'lma_components'
-                    if processes_map[sample['type']] ~= '' then
-                        msg['Fields']['name'] = msg['Fields']['name'] .. sep .. processes_map[sample['type']]
-                    end
-                    if sample['dsnames'][i] ~= 'value' then
-                        msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['dsnames'][i]
-                    end
-
-                    -- For ps_cputime, convert it to a percentage: collectd is
-                    -- sending us the number of microseconds allocated to the
-                    -- process as a rate so within 1 second.
-                    if sample['type'] == 'ps_cputime' then
-                        msg['Fields']['value'] = 100 * value / 1e6
-                    end
-                else
-                    -- metrics related to all processes
-                    msg['Fields']['name'] = 'processes'
-                    if sample['type'] == 'ps_state' then
-                        msg['Fields']['name'] = msg['Fields']['name'] .. sep .. 'count'
-                        msg['Fields']['state'] = sample['type_instance']
-                        table.insert(msg['Fields']['tag_fields'], 'state')
-                    else
-                        msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['type']
-                    end
-                end
-            elseif metric_source ==  'dbi' and sample['plugin_instance'] == 'mysql_status' then
-                msg['Fields']['name'] = 'mysql' .. sep .. replace_dot_by_sep(sample['type_instance'])
-            elseif metric_source == 'mysql' then
-                if sample['type'] == 'threads' then
-                    msg['Fields']['name'] = 'mysql_' .. metric_name
-                elseif sample['type'] == 'mysql_commands' then
-                    msg['Fields']['name'] = sample['type']
-                    msg['Fields']['statement'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'statement')
-                elseif sample['type'] == 'mysql_handler' then
-                    msg['Fields']['name'] = sample['type']
-                    msg['Fields']['handler'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'handler')
-                else
-                    msg['Fields']['name'] = metric_name
-                end
-            elseif metric_source == 'ntpd' then
-                if sample['type_instance'] == 'error' or sample['type_instance'] == 'loop' then
-                    msg['Fields']['name'] = 'ntp' .. sep .. sample['type'] .. sep .. sample['type_instance']
-                else
-                    msg['Fields']['name'] = 'ntp' .. sep .. sample['type'] .. sep .. 'peer'
-                    msg['Fields']['server'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'server')
-                end
-            elseif metric_source == 'check_openstack_api' then
-                -- For OpenStack API metrics, plugin_instance = <service name>
-                msg['Fields']['name'] = 'openstack_check_api'
-                msg['Fields']['service'] = sample['plugin_instance']
-                table.insert(msg['Fields']['tag_fields'], 'service')
-                if sample['meta'] then
-                    msg['Fields']['os_region'] = sample['meta']['region']
-                end
-            elseif metric_source == 'hypervisor_stats' then
-                -- Metrics from the OpenStack hypervisor metrics where
-                -- type_instance = <metric name> which can end by _MB or _GB
-                msg['Fields']['name'] = 'openstack' .. sep .. 'nova' .. sep
-                local name, unit
-                name, unit = string.match(sample['type_instance'], '^(.+)_(.B)$')
-                if name then
-                    msg['Fields']['name'] = msg['Fields']['name'] .. name
-                    msg.Fields['value'] = {value = msg.Fields['value'], representation = unit}
-                else
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sample['type_instance']
-                end
-            elseif metric_source == 'rabbitmq_info' then
-                msg['Fields']['name'] = 'rabbitmq' .. sep .. sample['type_instance']
-                if sample['meta'] and sample['meta']['queue'] then
-                    msg['Fields']['queue'] = sample['meta']['queue']
-                    table.insert(msg['Fields']['tag_fields'], 'queue')
-                end
-            elseif metric_source == 'nova' then
-                if sample['plugin_instance'] == 'nova_services' or
-                   sample['plugin_instance'] == 'nova_service'  then
-                    msg['Fields']['name'] = 'openstack_' .. sample['plugin_instance']
-                    msg['Fields']['service'] = sample['meta']['service']
-                    msg['Fields']['state'] = sample['meta']['state']
-                    table.insert(msg['Fields']['tag_fields'], 'service')
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                    if sample['plugin_instance'] == 'nova_service'  then
-                        msg['Fields']['hostname'] = sample['meta']['host']
-                    end
-                else
-                    msg['Fields']['name'] = 'openstack' .. sep .. 'nova' .. sep .. replace_dot_by_sep(sample['plugin_instance'])
-                    msg['Fields']['state'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                end
-            elseif metric_source == 'cinder' then
-                if sample['plugin_instance'] == 'cinder_services' or
-                   sample['plugin_instance'] == 'cinder_service' then
-                    msg['Fields']['name'] = 'openstack_' .. sample['plugin_instance']
-                    msg['Fields']['service'] = sample['meta']['service']
-                    msg['Fields']['state'] = sample['meta']['state']
-                    table.insert(msg['Fields']['tag_fields'], 'service')
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                    if sample['plugin_instance'] == 'cinder_service' then
-                        msg['Fields']['hostname'] = sample['meta']['host']
-                    end
-                else
-                    msg['Fields']['name'] = 'openstack' .. sep .. 'cinder' .. sep .. replace_dot_by_sep(sample['plugin_instance'])
-                    msg['Fields']['state'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                end
-            elseif metric_source == 'glance' then
-                msg['Fields']['name'] = 'openstack'  .. sep .. 'glance' .. sep .. sample['type_instance']
-                msg['Fields']['state'] = sample['meta']['status']
-                msg['Fields']['visibility'] = sample['meta']['visibility']
-                table.insert(msg['Fields']['tag_fields'], 'state')
-                table.insert(msg['Fields']['tag_fields'], 'visibility')
-            elseif metric_source == 'keystone' then
-                msg['Fields']['name'] = 'openstack'  .. sep .. 'keystone' .. sep .. sample['type_instance']
-                if sample['meta']['state'] then
-                    msg['Fields']['state'] = sample['meta']['state']
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                end
-            elseif metric_source == 'neutron' then
-                if sample['type_instance'] == 'networks' or sample['type_instance'] == 'ports' or sample['type_instance'] == 'routers' or sample['type_instance'] == 'floatingips' then
-                    skip_it = true
-                elseif sample['type_instance'] == 'subnets' then
-                    msg['Fields']['name'] = 'openstack'  .. sep .. 'neutron' .. sep .. 'subnets'
-                elseif sample['type_instance'] == 'neutron_agents' or
-                       sample['type_instance'] == 'neutron_agent' then
-                    msg['Fields']['name'] = 'openstack_' .. sample['type_instance']
-                    msg['Fields']['service'] = sample['meta']['service']
-                    msg['Fields']['state'] = sample['meta']['state']
-                    table.insert(msg['Fields']['tag_fields'], 'service')
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                    if sample['type_instance'] == 'neutron_agent'  then
-                        msg['Fields']['hostname'] = sample['meta']['host']
-                    end
-                elseif string.match(sample['type_instance'], '^ports') then
-                    local resource, owner, state = string.match(sample['type_instance'], '^([^.]+)%.([^.]+)%.(.+)$')
-                    msg['Fields']['name'] = 'openstack'  .. sep .. 'neutron' .. sep .. replace_dot_by_sep(resource)
-                    msg['Fields']['owner'] = owner
-                    msg['Fields']['state'] = state
-                    table.insert(msg['Fields']['tag_fields'], 'owner')
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                else
-                    local resource, state = string.match(sample['type_instance'], '^([^.]+)%.(.+)$')
-                    msg['Fields']['name'] = 'openstack'  .. sep .. 'neutron' .. sep .. replace_dot_by_sep(resource)
-                    msg['Fields']['state'] = state
-                    table.insert(msg['Fields']['tag_fields'], 'state')
-                end
-            elseif metric_source == 'memcached' then
-                msg['Fields']['name'] = 'memcached' .. sep .. string.gsub(metric_name, 'memcached_', '')
-            elseif metric_source == 'haproxy' then
-                msg['Fields']['name'] = 'haproxy' .. sep .. sample['type_instance']
-                if sample['meta'] then
-                    if sample['meta']['backend'] then
-                        msg['Fields']['backend'] = sample['meta']['backend']
-                        table.insert(msg['Fields']['tag_fields'], 'backend')
-                        if sample['meta']['state'] then
-                            msg['Fields']['state'] = sample['meta']['state']
-                            table.insert(msg['Fields']['tag_fields'], 'state')
-                        end
-                        if sample['meta']['server'] then
-                            msg['Fields']['server'] = sample['meta']['server']
-                            table.insert(msg['Fields']['tag_fields'], 'server')
-                        end
-                    elseif sample['meta']['frontend'] then
-                        msg['Fields']['frontend'] = sample['meta']['frontend']
-                        table.insert(msg['Fields']['tag_fields'], 'frontend')
-                    end
-                end
-            elseif metric_source == 'apache' then
-                metric_name = string.gsub(metric_name, 'apache_', '')
-                msg['Fields']['name'] = 'apache' .. sep .. string.gsub(metric_name, 'scoreboard', 'workers')
-            elseif metric_source == 'ceph_osd_perf' then
-                msg['Fields']['name'] = 'ceph_perf' .. sep .. sample['type']
-
-                msg['Fields']['cluster'] = sample['plugin_instance']
-                msg['Fields']['osd'] = sample['type_instance']
-                table.insert(msg['Fields']['tag_fields'], 'cluster')
-                table.insert(msg['Fields']['tag_fields'], 'osd')
-            elseif metric_source:match('^ceph') then
-                msg['Fields']['name'] = 'ceph' .. sep .. sample['type']
-                if sample['dsnames'][i] ~= 'value' then
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['dsnames'][i]
-                end
-
-                msg['Fields']['cluster'] = sample['plugin_instance']
-                table.insert(msg['Fields']['tag_fields'], 'cluster')
-
-                if sample['type_instance'] ~= '' then
-                    local additional_tag
-                    if string.match(sample['type'], '^pool_') then
-                        additional_tag = 'pool'
-                    elseif string.match(sample['type'], '^pg_state') then
-                        additional_tag = 'state'
-                    elseif string.match(sample['type'], '^osd_') then
-                        additional_tag = 'osd'
-                    end
-                    if additional_tag then
-                        msg['Fields'][additional_tag] = sample['type_instance']
-                        table.insert(msg['Fields']['tag_fields'], additional_tag)
-                    end
-                end
-            elseif metric_source == 'pacemaker' then
-                if sample['meta'] and sample['meta']['host'] then
-                    msg['Fields']['hostname'] = sample['meta']['host']
-                end
-
-                msg['Fields']['name'] = metric_source .. sep .. sample['type_instance']
-
-                -- add dimension fields
-                for _, v in ipairs({'status', 'resource'}) do
-                    if sample['meta'] and sample['meta'][v] then
-                        msg['Fields'][v] = sample['meta'][v]
-                        table.insert(msg['Fields']['tag_fields'], v)
-                    end
-                end
-            elseif metric_source ==  'users' then
-                -- 'users' is a reserved name for InfluxDB v0.9
-                msg['Fields']['name'] = 'logged_users'
-            elseif metric_source ==  'libvirt' then
-                -- collectd sends the instance's ID in the 'host' field
-                msg['Fields']['instance_id'] = sample['host']
-                table.insert(msg['Fields']['tag_fields'], 'instance_id')
-                msg['Fields']['hostname'] = hostname
-                msg['Hostname'] = hostname
-
-                if string.match(sample['type'], '^disk_') then
-                    msg['Fields']['name'] = 'virt' .. sep .. sample['type'] .. sep .. sample['dsnames'][i]
-                    msg['Fields']['device'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'device')
-                elseif string.match(sample['type'], '^if_') then
-                    msg['Fields']['name'] = 'virt' .. sep .. sample['type'] .. sep .. sample['dsnames'][i]
-                    msg['Fields']['interface'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'interface')
-                elseif sample['type'] == 'virt_cpu_total' then
-                    msg['Fields']['name'] = 'virt_cpu_time'
-                elseif sample['type'] == 'virt_vcpu' then
-                    msg['Fields']['name'] = 'virt_vcpu_time'
-                    msg['Fields']['vcpu_number'] = sample['type_instance']
-                    table.insert(msg['Fields']['tag_fields'], 'vcpu_number')
-                else
-                    msg['Fields']['name'] = 'virt' .. sep .. metric_name
-                end
-            elseif metric_source == 'elasticsearch_cluster' or metric_source == 'influxdb' then
-                msg['Fields']['name'] = metric_source .. sep .. sample['type_instance']
-            elseif metric_source == 'http_check' then
-                msg['Fields']['name'] = metric_source
-                msg['Fields']['service'] = sample['type_instance']
-                table.insert(msg['Fields']['tag_fields'], 'service')
-            elseif metric_source == 'check_local_endpoint' then
-                msg['Fields']['name'] = 'openstack_check_local_api'
-                msg['Fields']['service'] = sample['type_instance']
-                table.insert(msg['Fields']['tag_fields'], 'service')
-            elseif metric_source == 'nginx' then
-                msg['Fields']['name'] = 'nginx' .. sep .. string.gsub(sample['type'], '^nginx_', '')
-                if sample['type_instance'] ~= "" then
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['type_instance']
-                end
-            else
-                -- generic metric name translation for 3rd-party sources
-                msg['Fields']['name'] = sample['plugin']
-                if sample['plugin_instance'] ~= "" then
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['plugin_instance']
-                end
-                if sample['type'] ~= 'gauge' and sample['type'] ~= 'derive' and
-                   sample['type'] ~= 'counter' and sample['type'] ~= 'absolute' then
-                   -- only for custom DS types
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['type']
-                end
-                if sample['type_instance'] ~= "" then
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['type_instance']
-                end
-                if sample['dsnames'][i] ~= "value" then
-                    msg['Fields']['name'] = msg['Fields']['name'] .. sep .. sample['dsnames'][i]
-                end
-                msg['Fields']['name'] = replace_dot_by_sep(msg['Fields']['name'])
-
-                -- add meta fields as tag_fields
-                for k, v in pairs(sample['meta'] or {}) do
-                    if tostring(k) ~= '0' then
-                        msg['Fields'][k] = v
-                        table.insert(msg['Fields']['tag_fields'], k)
-                   end
-                end
-            end
-
-            if not skip_it then
-                utils.inject_tags(msg)
-                -- Before injecting the message we need to check that tag_fields is not an
-                -- empty table otherwise the protobuf encoder fails to encode the table.
-                if #msg['Fields']['tag_fields'] == 0 then
-                    msg['Fields']['tag_fields'] = nil
-                end
-                utils.safe_inject_message(msg)
-                if metric_source == 'swap' and metric_name == 'swap_used' and swap_size > 0 then
-                    -- collectd 5.4.0 doesn't report the used swap in
-                    -- percentage, this is why the metric is computed and
-                    -- injected by this plugin.
-                    msg['Fields']['name'] = 'swap_percent_used'
-                    msg['Fields']['value'] = value / swap_size
-                    utils.safe_inject_message(msg)
-                end
-            end
-        end
-    end
-
-    return 0
-end
diff --git a/heka/files/lua/decoders/contrail_api_stdout_log.lua b/heka/files/lua/decoders/contrail_api_stdout_log.lua
deleted file mode 100644
index 9e7f513..0000000
--- a/heka/files/lua/decoders/contrail_api_stdout_log.lua
+++ /dev/null
@@ -1,71 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-require "string"
-require "table"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt = require 'patterns'
-local contrail = require 'contrail_patterns'
-local utils  = require 'lma_utils'
-
-local default_severity = read_config('default_severity') or 'NOTICE'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-
-    local m
-
-    m = contrail.ApiGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-
-    msg.Logger = logger
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Pid = m.Pid
-    msg.Severity = utils.label_to_severity_map[m.Severity or default_severity]
-    msg.Fields = {}
-    msg.Fields.severity_label = m.Severity or default_severity
-    msg.Fields.programname = m.Module
-
-    m = contrail.RequestGrammar:match(msg.Payload)
-    if m then
-        msg.Fields.http_method = m.http_method
-        msg.Fields.http_status = m.http_status
-        msg.Fields.http_url = m.http_url
-        msg.Fields.http_version = m.http_version
-        msg.Fields.http_response_size = m.http_response_size
-        msg.Fields.http_response_time = m.http_response_time
-        m = patt.ip_address:match(msg.Payload)
-	if m then
-           msg.Fields.http_client_ip_address = m.ip_address
-	end
-    end
-
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/contrail_collector_log.lua b/heka/files/lua/decoders/contrail_collector_log.lua
deleted file mode 100644
index c739a7f..0000000
--- a/heka/files/lua/decoders/contrail_collector_log.lua
+++ /dev/null
@@ -1,49 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local dt     = require "date_time"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local contrail   = require 'contrail_patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 5,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = contrail.ControlGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Fields = {}
-    msg.Pid = m.Pid
-    msg.Fields.programname = m.Module
-    local severity = m.Severity or "SYS_NOTICE"
-    msg.Severity = utils.label_to_severity_map[severity] or 5
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/contrail_log.lua b/heka/files/lua/decoders/contrail_log.lua
deleted file mode 100644
index b2c48ce..0000000
--- a/heka/files/lua/decoders/contrail_log.lua
+++ /dev/null
@@ -1,44 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-local utils  = require 'lma_utils'
-l.locale(l)
-
-local contrail   = require 'contrail_patterns'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 6,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = contrail.LogGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Fields = {}
-    msg.Fields.severity_label = 'INFO'
-    msg.Fields.programname = m.Module
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/contrail_supervisor_log.lua b/heka/files/lua/decoders/contrail_supervisor_log.lua
deleted file mode 100644
index a108fa5..0000000
--- a/heka/files/lua/decoders/contrail_supervisor_log.lua
+++ /dev/null
@@ -1,48 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 5,
-}
-
-local timestamp_grammar = l.Cg(patt.Timestamp, "Timestamp")
-local SeverityLabel = l.Cg(patt.SeverityLabel + l.P"CRIT" + l.P"WARN", "SeverityLabel")
-local grammar = l.Ct(timestamp_grammar * patt.sp * SeverityLabel * l.Cg(patt.Message, "Message"))
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = grammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Fields = {}
-    msg.Fields.severity_label = m.SeverityLabel
-    msg.Fields.programname = m.Module
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/galera.lua b/heka/files/lua/decoders/galera.lua
deleted file mode 100644
index c9f385d..0000000
--- a/heka/files/lua/decoders/galera.lua
+++ /dev/null
@@ -1,63 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-require "string"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils = require "lma_utils"
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
-local programname = read_config('programname') or 'mysql'
-
--- mysql log messages are formatted like this
---
--- 2016-11-09 08:42:34 18430 [Note] InnoDB: Using atomics to ref count buffer pool pages
-local sp = l.space
-local timestamp = l.Cg(patt.Timestamp, "Timestamp")
-local pid = l.Cg(patt.Pid, "Pid")
-local severity = l.P"[" * l.Cg(l.R("az", "AZ")^0 / string.upper, "SeverityLabel") * l.P"]"
-local message = l.Cg(patt.Message, "Message")
-
-local grammar = l.Ct(timestamp * sp^1 * pid * sp^1 * severity * sp^1 * message)
-
-
-function process_message ()
-    local log = read_message("Payload")
-    local m = grammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse: %s", string.sub(log, 1, 64))
-    end
-
-    msg.Timestamp = m.Timestamp
-    msg.Pid = m.Pid
-    msg.Severity = utils.label_to_severity_map[m.SeverityLabel] or utils.label_to_severity_map.DEBUG
-    msg.Payload = m.Message
-
-    msg.Fields = {}
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    msg.Fields.programname = programname
-
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/generic_syslog.lua b/heka/files/lua/decoders/generic_syslog.lua
deleted file mode 100644
index 48e5262..0000000
--- a/heka/files/lua/decoders/generic_syslog.lua
+++ /dev/null
@@ -1,50 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "string"
-
-local syslog = require "syslog"
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
-local syslog_pattern = read_config("syslog_pattern") or error("syslog_pattern configuration must be specified")
-local syslog_grammar = syslog.build_rsyslog_grammar(syslog_pattern)
-
--- This grammar is intended for log messages that are generated before RSYSLOG
--- is fully configured
-local fallback_syslog_pattern = read_config("fallback_syslog_pattern")
-local fallback_syslog_grammar
-if fallback_syslog_pattern then
-    fallback_syslog_grammar = syslog.build_rsyslog_grammar(fallback_syslog_pattern)
-end
-
-function process_message ()
-    local log = read_message("Payload")
-
-    if utils.parse_syslog_message(syslog_grammar, log, msg) or
-       (fallback_syslog_grammar and utils.parse_syslog_message(fallback_syslog_grammar, log, msg)) then
-        msg.Logger = string.gsub(read_message('Logger'), '%.log$', '')
-        return utils.safe_inject_message(msg)
-    end
-
-    return -1
-end
diff --git a/heka/files/lua/decoders/glusterfs.lua b/heka/files/lua/decoders/glusterfs.lua
deleted file mode 100644
index 5ce8d6f..0000000
--- a/heka/files/lua/decoders/glusterfs.lua
+++ /dev/null
@@ -1,66 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-require "string"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils = require "lma_utils"
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
--- glusterfs log messages are formatted like this
---
--- [2016-11-09 08:31:55.192673] I [socket.c:3480:socket_init] 0-glusterfs: SSL support is NOT enabled
-local sp = l.space
-local timestamp = l.P'[' * l.Cg(patt.Timestamp, "Timestamp") * l.P']'
-local severity = l.Cg(l.R("AZ") / string.upper, "SeverityLabel")
-local message = l.Cg(patt.Message, "Message")
-
-local grammar = l.Ct(timestamp * sp * severity * sp * message)
-
-
-function process_message ()
-    local logger, programname = string.match(read_message('Logger'), '^([^.]+)%.(.+)')
-    if not logger or not programname then
-        return -1, string.format("Failed to parse Logger field: %s", read_message('Logger'))
-    end
-
-    local log = read_message("Payload")
-    local m = grammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse: %s", string.sub(log, 1, 64))
-    end
-
-    msg.Logger = logger
-    msg.Timestamp = m.Timestamp
-    msg.Severity = utils.label_to_severity_map[m.SeverityLabel] or utils.label_to_severity_map.DEBUG
-    msg.Payload = m.Message
-
-    msg.Fields = {}
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    msg.Fields.programname = programname
-
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
-
diff --git a/heka/files/lua/decoders/ifmap.lua b/heka/files/lua/decoders/ifmap.lua
deleted file mode 100644
index b11c6b5..0000000
--- a/heka/files/lua/decoders/ifmap.lua
+++ /dev/null
@@ -1,46 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-local utils  = require 'lma_utils'
-l.locale(l)
-
-local java  = require 'java_patterns'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 6,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = java.IfmapLogGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Pid = m.Pid
-    msg.Severity = utils.label_to_severity_map[m.SeverityLabel or 'INFO'] or 6
-    msg.Fields = {}
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    msg.Fields.programname = 'ifmap'
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/keystone_wsgi_log.lua b/heka/files/lua/decoders/keystone_wsgi_log.lua
deleted file mode 100644
index a3c970b..0000000
--- a/heka/files/lua/decoders/keystone_wsgi_log.lua
+++ /dev/null
@@ -1,73 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local l      = require 'lpeg'
-l.locale(l)
-
-local common_log_format = require 'common_log_format'
-local patt = require 'patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 6,
-}
-
-local severity_label = utils.severity_to_label_map[msg.Severity]
-
-local apache_log_pattern = read_config("apache_log_pattern") or error(
-    "apache_log_pattern configuration must be specificed")
-local apache_grammar = common_log_format.build_apache_grammar(apache_log_pattern)
-local request_grammar = l.Ct(patt.http_request)
-
-function process_message ()
-
-    -- logger is either "keystone-wsgi-main" or "keystone-wsgi-admin"
-    local logger = read_message("Logger")
-
-    local log = read_message("Payload")
-
-    local m
-
-    m = apache_grammar:match(log)
-    if m then
-        msg.Logger = 'openstack.keystone'
-        msg.Payload = log
-        msg.Timestamp = m.time
-
-        msg.Fields = {}
-        msg.Fields.http_status = m.status
-        msg.Fields.http_response_time = m.request_time.value / 1e6 -- us to sec
-        msg.Fields.programname = logger
-        msg.Fields.severity_label = severity_label
-
-        local request = m.request
-        m = request_grammar:match(request)
-        if m then
-            msg.Fields.http_method = m.http_method
-            msg.Fields.http_url = m.http_url
-            msg.Fields.http_version = m.http_version
-        end
-
-        utils.inject_tags(msg)
-        return utils.safe_inject_message(msg)
-    end
-
-    return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-end
diff --git a/heka/files/lua/decoders/libvirt_log.lua b/heka/files/lua/decoders/libvirt_log.lua
deleted file mode 100644
index a191b8f..0000000
--- a/heka/files/lua/decoders/libvirt_log.lua
+++ /dev/null
@@ -1,63 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-l.locale(l)
-
-local string = require 'string'
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
--- libvirt message logs are formatted like this:
---
--- 2015-03-26 17:24:52.126+0000: <PID>: <SEV> : Message
-
-local timestamp = l.Cg(patt.Timestamp, "Timestamp")
-local pid  = l.Cg(patt.Pid, "Pid")
-local severity = l.Cg(l.P"debug" + "info" + "warning" + "error", "Severity")
-local message = l.Cg(patt.Message, "Message")
-
-local grammar = l.Ct(timestamp * ": " * pid * ": " * severity * " : " * message)
-
-function process_message ()
-    local log = read_message("Payload")
-
-    local m = grammar:match(log)
-    if not m then
-        return -1
-    end
-
-    m.Severity = string.upper(m.Severity)
-
-    msg.Timestamp = m.Timestamp
-    msg.Pid = m.Pid
-    msg.Payload = m.Message
-    msg.Severity = utils.label_to_severity_map[m.Severity]
-
-    msg.Fields = {}
-    msg.Fields.severity_label = m.Severity
-    msg.Fields.programname = 'libvirt'
-    utils.inject_tags(msg)
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/metering.lua b/heka/files/lua/decoders/metering.lua
deleted file mode 100644
index d075730..0000000
--- a/heka/files/lua/decoders/metering.lua
+++ /dev/null
@@ -1,35 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-local table = require 'table'
-local utils = require 'lma_utils'
-local l = require 'lpeg'
-l.locale(l)
-
-local decoder_module = read_config('decoder') or error("Decoder module should be defined")
-
-local inject = utils.safe_inject_message
-
-if decoder_module then
-    inject = require(decoder_module).decode
-    if not inject then
-        error(decoder_module .. " does not provide a decode function")
-    end
-end
-
-function process_message ()
-    local data = read_message("Payload")
-    local code, msg = inject(data)
-    return code, msg
-end
diff --git a/heka/files/lua/decoders/metric.lua b/heka/files/lua/decoders/metric.lua
deleted file mode 100644
index 0994a00..0000000
--- a/heka/files/lua/decoders/metric.lua
+++ /dev/null
@@ -1,90 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-require "cjson"
-require "string"
-
-local l = require 'lpeg'
-l.locale(l)
-
-local loggers_pattern = l.Ct( (l.C((l.P(1) - l.space)^1) * l.space^0)^1 * -1)
-local loggers_list = loggers_pattern:match(read_config('deserialize_bulk_metric_for_loggers') or '')
-
-local loggers = {}
-for _, logger in ipairs(loggers_list) do
-    loggers[logger] = true
-end
-
-local utils = require 'lma_utils'
-
-function process_message ()
-    local msg = decode_message(read_message("raw"))
-    if string.match(msg.Type, 'bulk_metric$') and loggers[msg.Logger] ~= nil then
-
-        local ok, metrics = pcall(cjson.decode, msg.Payload)
-        if not ok then
-            return -1, metrics
-        end
-
-        local new_msg = {
-            Timestamp = msg.Timestamp,
-            Hostname = msg.Hostname,
-            Severity = msg.Severity,
-            Logger = msg.Logger,
-            Type = nil,
-            Payload = '',
-            Fields = {},
-        }
-        for _, metric in ipairs(metrics) do
-            local fields = {}
-            local metric_type
-            if metric.value then
-                metric_type = 'metric'
-                fields['value'] = metric.value
-            else
-                metric_type = 'multivalue_metric'
-                local value_fields = {}
-                for k, v in pairs(metric.values) do
-                    fields[k] = v
-                    table.insert(value_fields, k)
-                end
-                fields['value_fields'] = value_fields
-            end
-            local tag_fields = {}
-            for t, v in pairs(metric.tags or {}) do
-                fields[t] = v
-                table.insert(tag_fields, t)
-            end
-            fields['tag_fields'] = tag_fields
-            fields['name'] = metric.name
-            fields['hostname'] = msg.Hostname
-
-            new_msg.Type = metric_type
-            new_msg.Fields = fields
-
-            utils.inject_tags(new_msg)
-            ok, err = utils.safe_inject_message(new_msg)
-            if ok ~= 0 then
-                return -1, err
-            end
-        end
-    else -- simple metric
-        utils.inject_tags(msg)
-        ok, err = utils.safe_inject_message(msg)
-        if ok ~= 0 then
-            return -1, err
-        end
-    end
-    return 0
-end
diff --git a/heka/files/lua/decoders/mysql_log.lua b/heka/files/lua/decoders/mysql_log.lua
deleted file mode 100644
index 689aa16..0000000
--- a/heka/files/lua/decoders/mysql_log.lua
+++ /dev/null
@@ -1,57 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "string"
-local l      = require 'lpeg'
-l.locale(l)
-
-local syslog = require "syslog"
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
-local syslog_pattern = read_config("syslog_pattern") or error("syslog_pattern configuration must be specified")
-
-local sp    = l.space
-local colon = l.P":"
-
-local syslog_grammar = syslog.build_rsyslog_grammar(syslog_pattern)
-
--- mysqld logs are cranky,the date is YYMMMDD, the hours have no leading zero and the "real" severity level is enclosed by square brackets...
-local mysql_grammar = l.Ct(l.digit^-6 * sp^1 *  l.digit^-2 * colon * l.digit^-2 * colon * l.digit^-2 * sp^1 * l.P"[" * l.Cg(l.R("az", "AZ")^0 / string.upper, "SeverityLabel") * l.P"]" * sp^1 * l.Cg(patt.Message, "Message"))
-
-
-function process_message ()
-    local log = read_message("Payload")
-
-    if not utils.parse_syslog_message(syslog_grammar, log, msg) then
-        return -1
-    end
-
-    local m = mysql_grammar:match(msg.Payload)
-    if m then
-        msg.Fields.severity_label = m.SeverityLabel
-        msg.Payload = m.Message
-    end
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/noop.lua b/heka/files/lua/decoders/noop.lua
deleted file mode 100644
index be9a9dd..0000000
--- a/heka/files/lua/decoders/noop.lua
+++ /dev/null
@@ -1,28 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local msg_type = read_config('msg_type') or error('msg_type must be defined')
-
-local msg = {
-    Type = msg_type,
-    Severity = 7, -- debug
-    Payload = nil,
-    Fields = nil,
-}
-
-function process_message ()
-    inject_message(msg)
-
-    return 0
-end
diff --git a/heka/files/lua/decoders/notification.lua b/heka/files/lua/decoders/notification.lua
deleted file mode 100644
index d4073d9..0000000
--- a/heka/files/lua/decoders/notification.lua
+++ /dev/null
@@ -1,152 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "string"
-require "cjson"
-
-local patt = require 'patterns'
-local utils = require 'lma_utils'
-
-local msg = {
-    Timestamp = nil,
-    Type = "notification",
-    Payload = nil,
-    Fields = nil
-}
-
--- Mapping table from event_type prefixes to notification loggers
-local logger_map = {
-    --cinder
-    volume = 'cinder',
-    snapshot = 'cinder',
-    -- glance
-    image = 'glance',
-    -- heat
-    orchestration = 'heat',
-    -- keystone
-    identity = 'keystone',
-    -- nova
-    compute = 'nova',
-    compute_task = 'nova',
-    scheduler = 'nova',
-    keypair = 'nova',
-    -- neutron
-    floatingip = 'neutron',
-    security_group = 'neutron',
-    security_group_rule = 'neutron',
-    network = 'neutron',
-    port = 'neutron',
-    router = 'neutron',
-    subnet = 'neutron',
-    -- sahara
-    sahara = 'sahara',
-}
-
--- Mapping table between the attributes in the notification's payload and the
--- fields in the Heka message
-local payload_fields = {
-    -- all
-    tenant_id = 'tenant_id',
-    user_id = 'user_id',
-    display_name = 'display_name',
-    -- nova
-    vcpus = 'vcpus',
-    availability_zone = 'availability_zone',
-    instance_id = 'instance_id',
-    instance_type = 'instance_type',
-    image_name = 'image_name',
-    memory_mb = 'memory_mb',
-    disk_gb = 'disk_gb',
-    state = 'state',
-    old_state = 'old_state',
-    old_task_state = 'old_task_state',
-    new_task_state = 'new_task_state',
-    created_at = 'created_at',
-    launched_at = 'launched_at',
-    deleted_at = 'deleted_at',
-    terminated_at = 'terminated_at',
-    -- neutron
-    network_id = 'network_id',
-    subnet_id = 'subnet_id',
-    port_id = 'port_id',
-    -- cinder
-    volume_id = 'volume_id',
-    size = 'size',
-    status = 'state',
-    replication_status = 'replication_status',
-}
-
-function normalize_uuid(uuid)
-    return patt.Uuid:match(uuid)
-end
-
--- Mapping table defining transformation functions to be applied, keys are the
--- attributes in the notification's payload and values are Lua functions
-local transform_functions = {
-    created_at = utils.format_datetime,
-    launched_at = utils.format_datetime,
-    deleted_at = utils.format_datetime,
-    terminated_at = utils.format_datetime,
-    user_id = normalize_uuid,
-    tenant_id = normalize_uuid,
-    instance_id = normalize_uuid,
-    network_id = normalize_uuid,
-    subnet_id = normalize_uuid,
-    port_id = normalize_uuid,
-    volume_id = normalize_uuid,
-}
-
-local include_full_notification = read_config("include_full_notification") or false
-
-function process_message ()
-    local data = read_message("Payload")
-    local ok, notif = pcall(cjson.decode, data)
-    if not ok then
-        return -1
-    end
-
-    if include_full_notification then
-        msg.Payload = data
-    else
-        msg.Payload = utils.safe_json_encode(notif.payload) or '{}'
-    end
-
-    msg.Fields = {}
-    msg.Logger = logger_map[string.match(notif.event_type, '([^.]+)')]
-    msg.Severity = utils.label_to_severity_map[notif.priority]
-    msg.Timestamp = patt.Timestamp:match(notif.timestamp)
-    msg.Fields.publisher, msg.Hostname = string.match(notif.publisher_id, '([^.]+)%.([%w_-]+)')
-    if notif.payload.host ~= nil then
-        msg.Hostname = string.match(notif.payload.host, '([%w_-]+)')
-    end
-
-    msg.Fields.event_type = notif.event_type
-    msg.Fields.severity_label = notif.priority
-    msg.Fields.hostname = msg.Hostname
-
-    for k, v in pairs(payload_fields) do
-        local val = notif.payload[k]
-        if val ~= nil then
-            local name = payload_fields[k] or k
-            local transform = transform_functions[k]
-            if transform ~= nil then
-                msg.Fields[name] = transform(val)
-            else
-                msg.Fields[name] = val
-            end
-        end
-    end
-    utils.inject_tags(msg)
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/openstack_log.lua b/heka/files/lua/decoders/openstack_log.lua
deleted file mode 100644
index 9199bd4..0000000
--- a/heka/files/lua/decoders/openstack_log.lua
+++ /dev/null
@@ -1,143 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "string"
-require "table"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt = require 'patterns'
-local utils  = require 'lma_utils'
-local table_utils = require 'table_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
--- traceback_lines is a reference to a table used to accumulate lines of
--- a Traceback. traceback_key represent the key of the Traceback lines
--- being accumulated in traceback_lines. This is used to know when to
--- stop accumulating and inject the Heka message.
-local traceback_key = nil
-local traceback_lines = nil
-
-function prepare_message (service, timestamp, pid, severity_label,
-        python_module, programname, payload)
-    msg.Logger = 'openstack.' .. service
-    msg.Timestamp = timestamp
-    msg.Payload = payload
-    msg.Pid = pid
-    msg.Severity = utils.label_to_severity_map[severity_label] or 7
-    msg.Fields = {}
-    msg.Fields.severity_label = severity_label
-    msg.Fields.python_module = python_module
-    msg.Fields.programname = programname
-    msg.Payload = payload
-end
-
--- OpenStack log messages are of this form:
--- 2015-11-30 08:38:59.306 3434 INFO oslo_service.periodic_task [-] Blabla...
---
--- [-] is the "request" part, it can take multiple forms.
-
-function process_message ()
-
-    -- Logger is of form "<service>_<program>" (e.g. "nova_nova-api",
-    -- "neutron_l3-agent").
-    local logger = read_message("Logger")
-    local service, program = string.match(logger, '([^_]+)_(.+)')
-
-    local log = read_message("Payload")
-    local m
-
-    m = patt.openstack:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-
-    local key = {
-        Timestamp     = m.Timestamp,
-        Pid           = m.Pid,
-        SeverityLabel = m.SeverityLabel,
-        PythonModule  = m.PythonModule,
-        service       = service,
-        program       = program,
-    }
-
-    if traceback_key ~= nil then
-        -- If traceback_key is not nil then it means we've started accumulated
-        -- lines of a Python traceback. We keep accumulating the traceback
-        -- lines util we get a different log key.
-        if table_utils.table_equal(traceback_key, key) then
-            table.insert(traceback_lines, m.Message)
-            return 0
-        else
-            prepare_message(traceback_key.service, traceback_key.Timestamp,
-                traceback_key.Pid, traceback_key.SeverityLabel,
-                traceback_key.PythonModule, traceback_key.program,
-                table.concat(traceback_lines, ''))
-            traceback_key = nil
-            traceback_lines = nil
-            utils.inject_tags(msg)
-            -- Ignore safe_inject_message status code here to still get a
-            -- chance to inject the current log message.
-            utils.safe_inject_message(msg)
-        end
-    end
-
-    if patt.traceback:match(m.Message) then
-        -- Python traceback detected, begin accumulating the lines making
-        -- up the traceback.
-        traceback_key = key
-        traceback_lines = {}
-        table.insert(traceback_lines, m.Message)
-        return 0
-    end
-
-    prepare_message(service, m.Timestamp, m.Pid, m.SeverityLabel, m.PythonModule,
-        program, m.Message)
-
-    m = patt.openstack_request_context:match(msg.Payload)
-    if m then
-        msg.Fields.request_id = m.RequestId
-        if m.UserId then
-          msg.Fields.user_id = m.UserId
-        end
-        if m.TenantId then
-          msg.Fields.tenant_id = m.TenantId
-        end
-    end
-
-    m = patt.openstack_http:match(msg.Payload)
-    if m then
-        msg.Fields.http_method = m.http_method
-        msg.Fields.http_status = m.http_status
-        msg.Fields.http_url = m.http_url
-        msg.Fields.http_version = m.http_version
-        msg.Fields.http_response_size = m.http_response_size
-        msg.Fields.http_response_time = m.http_response_time
-        m = patt.ip_address:match(msg.Payload)
-        if m then
-            msg.Fields.http_client_ip_address = m.ip_address
-        end
-    end
-
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/ovs_log.lua b/heka/files/lua/decoders/ovs_log.lua
deleted file mode 100644
index 47b88eb..0000000
--- a/heka/files/lua/decoders/ovs_log.lua
+++ /dev/null
@@ -1,62 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local l      = require 'lpeg'
-l.locale(l)
-
-local syslog = require "syslog"
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Paload      = nil,
-    Logger      = 'ovs',
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
-local pipe = l.P'|'
-
-local function_name = l.Cg((l.R("az", "AZ", "09") + l.P"." + l.P"-" + l.P"_" + l.P"(" + l.P")")^1, 'function_name')
-local pid       = l.Cg(patt.Pid, "Pid")
-local timestamp = l.Cg(patt.Timestamp, "Timestamp")
-local severity = l.Cg(syslog.severity, 'Severity')
-local message = l.Cg(l.P(1 - l.P"\n")^0, "Message")
-
-local ovs_grammar = l.Ct(timestamp * pipe * pid * pipe * function_name * pipe * severity * pipe * message)
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m
-
-    msg.Fields = {}
-    m = ovs_grammar:match(log)
-    if not m then
-        return -1
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.function_name .. ': ' .. m.Message
-    msg.Pid = m.Pid
-    msg.Severity = m.Severity or 5
-    msg.Fields.severity_label = utils.severity_to_label_map[m.Severity]
-    msg.Fields.programname = logger
-
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/pacemaker_log.lua b/heka/files/lua/decoders/pacemaker_log.lua
deleted file mode 100644
index 1286e89..0000000
--- a/heka/files/lua/decoders/pacemaker_log.lua
+++ /dev/null
@@ -1,75 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "string"
-local l      = require 'lpeg'
-l.locale(l)
-
-local dt     = require "date_time"
-local patt   = require "patterns"
-local syslog = require "syslog"
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
-local syslog_pattern = read_config("syslog_pattern") or error("syslog_pattern configuration must be specified")
-local syslog_grammar = syslog.build_rsyslog_grammar(syslog_pattern)
-
--- This grammar is intended for debug and info messages which aren't emitted
--- through Syslog. For example:
--- Apr 29 13:23:46 [13545] node-32.domain.tld pacemakerd: INFO: get_cluster_type: Detected an active 'corosync' cluster
-local sp    = l.space
-local colon = l.P":"
-
-local timestamp   = l.Cg(dt.rfc3164_timestamp / dt.time_to_ns, "Timestamp")
-local pid         = l.Cg(patt.Pid, "Pid")
-local severity    = l.Cg((l.R"AZ" + l.R"az")^1 /  string.upper, "SeverityLabel")
-local programname = l.Cg(patt.programname, "programname")
-local message     = l.Cg(patt.Message, "Message")
-
-local fallback_grammar = l.Ct(timestamp * sp^1 * l.P'[' * pid * l.P']' * sp^1 *
-    (l.P(1) - sp)^0 * sp^1 * programname * colon * sp^1 * severity * colon *
-    sp^1 * message)
-
-function process_message ()
-    local log = read_message("Payload")
-
-    if utils.parse_syslog_message(syslog_grammar, log, msg) then
-        return utils.safe_inject_message(msg)
-    else
-        local m = fallback_grammar:match(log)
-        if m then
-            msg.Timestamp = m.Timestamp
-            msg.Payload = m.Message
-            msg.Pid = m.Pid
-            msg.Severity = utils.label_to_severity_map[m.SeverityLabel] or 7
-
-            msg.Fields = {}
-            msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-            msg.Fields.programname = m.programname
-            utils.inject_tags(msg)
-
-            return utils.safe_inject_message(msg)
-        end
-    end
-
-    return -1
-end
diff --git a/heka/files/lua/decoders/pacemaker_resources.lua b/heka/files/lua/decoders/pacemaker_resources.lua
deleted file mode 100644
index ae56965..0000000
--- a/heka/files/lua/decoders/pacemaker_resources.lua
+++ /dev/null
@@ -1,47 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'string'
-local l = require 'lpeg'
-local utils = require 'lma_utils'
-l.locale(l)
-
-local msg = {
-    Timestamp = nil,
-    Type = "metric",
-    Payload = nil,
-    Severity = 6, -- INFO
-    Fields = nil
-}
-
-local word = (l.R("az", "AZ", "09") + l.P"." + l.P"_" + l.P"-")^1
-local grammar = l.Ct(l.Cg(word, 'resource') * " " * l.Cg(l.xdigit, 'active'))
-
-function process_message ()
-    local data = read_message("Payload")
-    local m = grammar:match(data)
-    if not m then
-        return -1
-    end
-    msg.Timestamp = read_message("Timestamp")
-    msg.Payload = data
-    msg.Fields = {}
-    msg.Fields.source = 'pacemaker'
-    msg.Fields.type = utils.metric_type['GAUGE']
-    msg.Fields.hostname = read_message('Hostname')
-    utils.inject_tags(msg)
-
-    msg.Fields.name= string.format('pacemaker.resource.%s.active', m.resource)
-    msg.Fields.value = tonumber(m.active)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/rabbitmq.lua b/heka/files/lua/decoders/rabbitmq.lua
deleted file mode 100644
index 846a5f6..0000000
--- a/heka/files/lua/decoders/rabbitmq.lua
+++ /dev/null
@@ -1,71 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local dt     = require "date_time"
-local l      = require 'lpeg'
-l.locale(l)
-
-local patt   = require 'patterns'
-local utils  = require 'lma_utils'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = nil,
-}
-
--- RabbitMQ message logs are formatted like this:
---   =ERROR REPORT==== 2-Jan-2015::09:17:22 ===
---   Blabla
---   Blabla
---
-local message   = l.Cg(patt.Message / utils.chomp, "Message")
--- The token before 'REPORT' isn't standardized so it can be a valid severity
--- level as 'INFO' or 'ERROR' but also 'CRASH' or 'SUPERVISOR'.
-local severity  = l.Cg(l.R"AZ"^1, "SeverityLabel")
-local day = l.R"13" * l.R"09" + l.R"19"
-local datetime = l.Cg(day, "day") * patt.dash * dt.date_mabbr * patt.dash * dt.date_fullyear *
-                 "::" * dt.rfc3339_partial_time
-local timestamp = l.Cg(l.Ct(datetime)/ dt.time_to_ns, "Timestamp")
-
-local grammar = l.Ct("=" * severity * " REPORT==== " * timestamp * " ===" * l.P'\n' * message)
-
-function process_message ()
-    local log = read_message("Payload")
-
-    local m = grammar:match(log)
-    if not m then
-        return -1
-    end
-
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    if utils.label_to_severity_map[m.SeverityLabel] then
-        msg.Severity = utils.label_to_severity_map[m.SeverityLabel]
-    elseif m.SeverityLabel == 'CRASH' then
-        msg.Severity = 2 -- CRITICAL
-    else
-        msg.Severity = 5 -- NOTICE
-    end
-
-    msg.Fields = {}
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    msg.Fields.programname = 'rabbitmq'
-    utils.inject_tags(msg)
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/redis.lua b/heka/files/lua/decoders/redis.lua
deleted file mode 100644
index 75c5916..0000000
--- a/heka/files/lua/decoders/redis.lua
+++ /dev/null
@@ -1,45 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-local utils  = require 'lma_utils'
-l.locale(l)
-
-local redis  = require 'redis_patterns'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 6,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = redis.LogGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Pid = m.Pid
-    msg.Fields = {}
-    msg.Fields.severity_label = 'INFO'
-    msg.Fields.programname = 'redis'
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/decoders/zookeeper.lua b/heka/files/lua/decoders/zookeeper.lua
deleted file mode 100644
index ed3a338..0000000
--- a/heka/files/lua/decoders/zookeeper.lua
+++ /dev/null
@@ -1,46 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-local l      = require 'lpeg'
-local utils  = require 'lma_utils'
-l.locale(l)
-
-local java  = require 'java_patterns'
-
-local msg = {
-    Timestamp   = nil,
-    Type        = 'log',
-    Hostname    = nil,
-    Payload     = nil,
-    Pid         = nil,
-    Fields      = nil,
-    Severity    = 6,
-}
-
-function process_message ()
-    local log = read_message("Payload")
-    local logger = read_message("Logger")
-    local m = java.ZookeeperLogGrammar:match(log)
-    if not m then
-        return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
-    end
-    msg.Timestamp = m.Timestamp
-    msg.Payload = m.Message
-    msg.Pid = m.Pid
-    msg.Severity = utils.label_to_severity_map[m.SeverityLabel or 'INFO'] or 6
-    msg.Fields = {}
-    msg.Fields.severity_label = utils.severity_to_label_map[msg.Severity]
-    msg.Fields.programname = 'zookeeper'
-    utils.inject_tags(msg)
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/encoders/es_ceilometer_resources.lua b/heka/files/lua/encoders/es_ceilometer_resources.lua
deleted file mode 100644
index 61fb68c..0000000
--- a/heka/files/lua/encoders/es_ceilometer_resources.lua
+++ /dev/null
@@ -1,31 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-require "string"
-require "cjson"
-local utils = require "lma_utils"
-local encoder_module = read_config("encoder") or error("Encoder should be defined")
-
-local encode = require(encoder_module).encode
-if not encode then
-    error("Encoder should implements 'encode' function")
-end
-
-function process_message()
-    local code, payload = encode()
-    if code == 0 and payload then
-        return utils.safe_inject_payload('txt', 'elasticsearch', payload)
-    else
-        return code, payload
-    end
-end
diff --git a/heka/files/lua/encoders/status_nagios.lua b/heka/files/lua/encoders/status_nagios.lua
deleted file mode 100644
index 9957f70..0000000
--- a/heka/files/lua/encoders/status_nagios.lua
+++ /dev/null
@@ -1,94 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'table'
-require 'string'
-
-local afd = require 'afd'
-local consts = require 'gse_constants'
-local lma = require 'lma_utils'
-local interp = require "msg_interpolate"
-
--- These 2 configurations are used only to encode GSE messages
-local default_host = read_config('default_nagios_host')
-local host_dimension_key = read_config('nagios_host_dimension_key')
-
--- Nagios CGI cannot accept 'plugin_output' parameter greater than 1024 bytes
--- See bug #1517917 for details.
--- With the 'cmd.cgi' re-implementation for the command PROCESS_SERVICE_CHECK_RESULT,
--- this limit can be increased to 3KB. See blueprint scalable-nagios-api.
-local truncate_size = (read_config('truncate_size') or 3072) + 0
-local data = {
-   cmd_typ = '30',
-   cmd_mod = '2',
-   service = nil,
-   plugin_state = nil,
-   plugin_output = nil,
-   performance_data = '',
-}
-local nagios_break_line = '\\n'
--- mapping GSE statuses to Nagios states
-local nagios_state_map = {
-    [consts.OKAY]=0,
-    [consts.WARN]=1,
-    [consts.UNKW]=3,
-    [consts.CRIT]=2,
-    [consts.DOWN]=2
-}
-
-function url_encode(str)
-  if (str) then
-    str = string.gsub (str, "([^%w %-%_%.%~])",
-        function (c) return string.format ("%%%02X", string.byte(c)) end)
-    str = string.gsub (str, " ", "+")
-  end
-  return str
-end
-
-function process_message()
-    local service_name = read_message('Fields[member]')
-    local status = afd.get_status()
-    local alarms = afd.alarms_for_human(afd.extract_alarms())
-
-    if not service_name or not nagios_state_map[status] or not alarms then
-        return -1
-    end
-
-    if host_dimension_key then
-        data['host'] = read_message(string.format('Fields[%s]', host_dimension_key)) or default_host
-    else
-        data['host'] = read_message('Fields[hostname]') or read_message('Hostname')
-    end
-
-    data['service'] = service_name
-    data['plugin_state'] = nagios_state_map[status]
-
-    local details = {
-        string.format('%s %s', service_name, consts.status_label(status))
-    }
-    if #alarms == 0 then
-        details[#details+1] = 'no details'
-    else
-        for _, alarm in ipairs(alarms) do
-            details[#details+1] = alarm
-        end
-    end
-    data['plugin_output'] = lma.truncate(table.concat(details, nagios_break_line), truncate_size, nagios_break_line)
-
-    local params = {}
-    for k, v in pairs(data) do
-        params[#params+1] = string.format("%s=%s", k, url_encode(v))
-    end
-
-    return lma.safe_inject_payload('txt', 'nagios', table.concat(params, '&'))
-end
diff --git a/heka/files/lua/encoders/status_smtp.lua b/heka/files/lua/encoders/status_smtp.lua
deleted file mode 100644
index 3bfad7f..0000000
--- a/heka/files/lua/encoders/status_smtp.lua
+++ /dev/null
@@ -1,79 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-require 'table'
-require 'string'
-
-local afd = require 'afd'
-local consts = require 'gse_constants'
-local lma = require 'lma_utils'
-
-local statuses = {}
-
-local concat_string = '\n'
-
-function process_message()
-    local previous
-    local text
-    local cluster = afd.get_entity_name('cluster_name')
-    local msg_type = read_message("Type")
-    local status = afd.get_status()
-    local alarms = afd.extract_alarms()
-
-    if not cluster or not status or not alarms then
-        return -1
-    end
-    local key = string.format('%s.%s', msg_type, cluster)
-    if not statuses[key] then
-        statuses[key] = {}
-    end
-    previous = statuses[key]
-
-    local text
-    if #alarms == 0 then
-        text = 'no detail'
-    else
-        text = table.concat(afd.alarms_for_human(alarms), concat_string)
-    end
-
-    local title
-    if not previous.status and status == consts.OKAY then
-        -- don't send a email when we detect a new cluster which is OKAY
-        return 0
-    elseif not previous.status then
-        title = string.format('%s status is %s',
-                              cluster,
-                              consts.status_label(status))
-    elseif status ~= previous.status then
-        title = string.format('%s status %s -> %s',
-                              cluster,
-                              consts.status_label(previous.status),
-                              consts.status_label(status))
--- TODO(scroiset): avoid spam
--- This code has the same issue than annotations, see filters/influxdb_annotation.lua
---    elseif previous.text ~= text then
---        title = string.format('%s status remains %s',
---                              cluster,
---                              consts.status_label(status))
-    else
-        -- nothing has changed since the last message
-        return 0
-    end
-
-    -- store the last status and text for future messages
-    previous.status = status
-    previous.text = text
-
-    return lma.safe_inject_payload('txt', '', table.concat({title, text}, concat_string))
-end
diff --git a/heka/files/lua/filters/afd.lua b/heka/files/lua/filters/afd.lua
deleted file mode 100644
index ff622ed..0000000
--- a/heka/files/lua/filters/afd.lua
+++ /dev/null
@@ -1,84 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local table = require 'table'
-local string = require 'string'
-local cjson = require 'cjson'
-
-local utils = require 'lma_utils'
-local afd = require 'afd'
-
-local afd_file = read_config('afd_file') or error('afd_file must be specified')
-local afd_name = read_config('afd_name') or error('afd_name must be specified')
-local hostname = read_config('hostname') or error('hostname must be specified')
-local dimensions_json = read_config('dimensions') or ''
-local activate_alerting = read_config('activate_alerting') or true
-
-local all_alarms = require(afd_file)
-local A = require 'afd_alarms'
-A.load_alarms(all_alarms)
-
-local ok, dimensions = pcall(cjson.decode, dimensions_json)
-if not ok then
-    error(string.format('dimensions JSON is invalid (%s)', dimensions_json))
-end
-
-function process_message()
-
-    local metric_name = read_message('Fields[name]')
-    local ts = read_message('Timestamp')
-
-    local ok, value = utils.get_values_from_metric()
-    if not ok then
-        return -1, value
-    end
-    -- retrieve field values
-    local fields = {}
-    for _, field in ipairs (A.get_metric_fields(metric_name)) do
-        local field_value = afd.get_entity_name(field)
-        if not field_value then
-            return -1, "Cannot find Fields[" .. field .. "] for the metric " .. metric_name
-        end
-        fields[field] = field_value
-    end
-    A.add_value(ts, metric_name, value, fields)
-    return 0
-end
-
-function timer_event(ns)
-    if A.is_started() then
-        local state, alarms = A.evaluate(ns)
-        if state then -- it was time to evaluate at least one alarm
-            for _, alarm in ipairs(alarms) do
-                afd.add_to_alarms(
-                    alarm.state,
-                    alarm.alert['function'],
-                    alarm.alert.metric,
-                    alarm.alert.fields,
-                    {}, -- tags
-                    alarm.alert.operator,
-                    alarm.alert.value,
-                    alarm.alert.threshold,
-                    alarm.alert.window,
-                    alarm.alert.periods,
-                    alarm.alert.message)
-            end
-
-            afd.inject_afd_metric(state, hostname, afd_name, dimensions,
-                activate_alerting)
-        end
-    else
-        A.set_start_time(ns)
-    end
-end
diff --git a/heka/files/lua/filters/afd_api_backends.lua b/heka/files/lua/filters/afd_api_backends.lua
deleted file mode 100644
index 37cccd5..0000000
--- a/heka/files/lua/filters/afd_api_backends.lua
+++ /dev/null
@@ -1,90 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-require 'string'
-
-local afd = require 'afd'
-local consts = require 'gse_constants'
-
-local haproxy_backend_states = {}
-
--- emit AFD event metrics based on HAProxy backends
-function process_message()
-    local metric_name = read_message('Fields[name]')
-    local value = read_message('Fields[value]')
-    local service = read_message('Fields[backend]')
-    local state = consts.OKAY
-
-    if not haproxy_backend_states[service] then
-        haproxy_backend_states[service] = {}
-    end
-    haproxy_backend_states[service][read_message('Fields[state]')] = value
-
-    if not (haproxy_backend_states[service].up and haproxy_backend_states[service].down) then
-       -- not enough data for now
-       return 0
-   end
-
-   if haproxy_backend_states[service].up == 0 then
-        state = consts.DOWN
-        afd.add_to_alarms(consts.DOWN,
-                          'last',
-                          metric_name,
-                          {service=service,state='up'},
-                          {},
-                          '==',
-                          haproxy_backend_states[service].up,
-                          0,
-                          nil,
-                          nil,
-                          string.format("All %s backends are down", service))
-    elseif haproxy_backend_states[service].down >= haproxy_backend_states[service].up then
-        state = consts.CRIT
-        afd.add_to_alarms(consts.CRIT,
-                          'last',
-                          metric_name,
-                          {service=service,state='down'},
-                          {},
-                          '>=',
-                          haproxy_backend_states[service].down,
-                          haproxy_backend_states[service].up,
-                          nil,
-                          nil,
-                          string.format("More backends for %s are down than up", service))
-    elseif haproxy_backend_states[service].down > 0 then
-        state = consts.WARN
-        afd.add_to_alarms(consts.WARN,
-                          'last',
-                          metric_name,
-                          {service=service,state='down'},
-                          {},
-                          '>',
-                          haproxy_backend_states[service].down,
-                          0,
-                          nil,
-                          nil,
-                          string.format("At least one %s backend is down", service))
-    end
-
-    afd.inject_afd_service_metric(service,
-                                  state,
-                                  read_message('Fields[hostname]'),
-                                  0,
-                                  'backends')
-
-    -- reset the cache for this service
-    haproxy_backend_states[service] = {}
-
-    return 0
-end
diff --git a/heka/files/lua/filters/afd_workers.lua b/heka/files/lua/filters/afd_workers.lua
deleted file mode 100644
index 8eeb222..0000000
--- a/heka/files/lua/filters/afd_workers.lua
+++ /dev/null
@@ -1,94 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-require 'string'
-
-local afd = require 'afd'
-local consts = require 'gse_constants'
-
-local worker_states = {}
-
--- emit AFD event metrics based on openstack_nova_services, openstack_cinder_services and openstack_neutron_agents metrics
-function process_message()
-    local metric_name = read_message('Fields[name]')
-    local service = string.format('%s-%s',
-                                  string.match(metric_name, 'openstack_([^_]+)'),
-                                  read_message('Fields[service]'))
-    local worker_key = string.format('%s.%s', metric_name, service)
-
-    if not worker_states[worker_key] then
-        worker_states[worker_key] = {}
-    end
-
-    local worker = worker_states[worker_key]
-    worker[read_message('Fields[state]')] = read_message('Fields[value]')
-
-    local state = consts.OKAY
-    if not(worker.up and worker.down) then
-        -- not enough data for now
-        return 0
-    end
-
-    if worker.up == 0 then
-        state = consts.DOWN
-        afd.add_to_alarms(consts.DOWN,
-                          'last',
-                          metric_name,
-                          {service=service,state='up'},
-                          {},
-                          '==',
-                          worker.up,
-                          0,
-                          nil,
-                          nil,
-                          string.format("All instances for the service %s are down or disabled", service))
-    elseif worker.down >= worker.up then
-        state = consts.CRIT
-        afd.add_to_alarms(consts.CRIT,
-                          'last',
-                          metric_name,
-                          {service=service,state='down'},
-                          {},
-                          '>=',
-                          worker.down,
-                          worker.up,
-                          nil,
-                          nil,
-                          string.format("More instances of %s are down than up", service))
-    elseif worker.down > 0 then
-        state = consts.WARN
-        afd.add_to_alarms(consts.WARN,
-                          'last',
-                          metric_name,
-                          {service=service,state='down'},
-                          {},
-                          '>',
-                          worker.down,
-                          0,
-                          nil,
-                          nil,
-                          string.format("At least one %s instance is down", service))
-    end
-
-    afd.inject_afd_service_metric(service,
-                                  state,
-                                  read_message('Fields[hostname]'),
-                                  0,
-                                  'workers')
-
-    -- reset the cache for this worker
-    worker_states[worker_key] = {}
-
-    return 0
-end
diff --git a/heka/files/lua/filters/gse_cluster_filter.lua b/heka/files/lua/filters/gse_cluster_filter.lua
deleted file mode 100644
index 2bf6926..0000000
--- a/heka/files/lua/filters/gse_cluster_filter.lua
+++ /dev/null
@@ -1,112 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-local cjson = require 'cjson'
-
-local afd = require 'afd'
-local gse = require 'gse'
-local lma = require 'lma_utils'
-local policies = require('gse_policies')
-
-local topology_file = read_config('topology_file') or error('topology_file must be specified!')
-local interval = (read_config('interval') or 10) + 0
-local interval_in_ns = interval * 1e9
-local max_inject = (read_config('max_inject') or 10) + 0
-local warm_up_period = ((read_config('warm_up_period') or 0) + 0) * 1e9
-local dimensions_json = read_config('dimensions') or ''
-local activate_alerting = read_config('activate_alerting') or true
-
-local first_tick
-local last_tick = 0
-local last_index = nil
-
-local topology = require(topology_file)
-
-for cluster_name, attributes in pairs(topology.clusters) do
-    local policy = policies.find(attributes.policy)
-    if not policy then
-        error('Cannot find ' .. attributes.policy .. ' policy!')
-    end
-    gse.add_cluster(cluster_name, attributes.members, attributes.hints or {},
-        attributes.group_by, policy)
-end
-
-local ok, dimensions = pcall(cjson.decode, dimensions_json)
-if not ok then
-    error(string.format('dimensions JSON is invalid (%s)', dimensions_json))
-end
-
-function process_message()
-
-    local member_id = afd.get_entity_name('member')
-    if not member_id then
-        return -1, "Cannot find entity's name in the AFD/GSE message"
-    end
-
-    local status = afd.get_status()
-    if not status then
-        return -1, "Cannot find status in the AFD/GSE message"
-    end
-
-    local alarms = afd.extract_alarms()
-    if not alarms then
-        return -1, "Cannot find alarms in the AFD/GSE message"
-    end
-
-    -- "hostname" is nil here when the input message is a GSE message, so nil
-    -- is not an error condition here
-    local hostname = afd.get_entity_name('hostname')
-
-    local cluster_ids = gse.find_cluster_memberships(member_id)
-
-    -- update all clusters that depend on this entity
-    for _, cluster_id in ipairs(cluster_ids) do
-        local ok, err = gse.set_member_status(
-            cluster_id, member_id, status, alarms, hostname)
-        if not ok then
-            return -1, err
-        end
-    end
-
-    return 0
-end
-
-function timer_event(ns)
-    if not first_tick then
-        first_tick = ns
-        return
-    elseif ns - first_tick <= warm_up_period then
-        -- not started for a long enough period
-        return
-    elseif last_index == nil and (ns - last_tick) < interval_in_ns then
-        -- nothing to send it
-        return
-    end
-    last_tick = ns
-
-    local injected = 0
-    for i, cluster_name in ipairs(gse.get_ordered_clusters()) do
-        if last_index == nil or i > last_index then
-            gse.inject_cluster_metric(cluster_name, dimensions, activate_alerting)
-            last_index = i
-            injected = injected + 1
-
-            if injected >= max_inject then
-                return
-            end
-        end
-    end
-
-    last_index = nil
-end
diff --git a/heka/files/lua/filters/hdd_errors_counter.lua b/heka/files/lua/filters/hdd_errors_counter.lua
deleted file mode 100644
index 66980bc..0000000
--- a/heka/files/lua/filters/hdd_errors_counter.lua
+++ /dev/null
@@ -1,92 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-require 'math'
-require 'os'
-require 'string'
-local utils = require 'lma_utils'
-
-local hostname = read_config('hostname') or error('hostname must be specified')
-local patterns_config = read_config('patterns') or error('patterns must be specified')
-local patterns = {}
-for pattern in string.gmatch(patterns_config, "/(%S+)/") do
-    local ok, msg = pcall(string.match, "", pattern)
-    if not ok then
-        error("Invalid pattern detected: '" .. pattern "' (" .. msg .. ")")
-    end
-    patterns[#patterns + 1] = pattern
-end
--- Heka cannot guarantee that logs are processed in real-time so the
--- grace_interval parameter allows to take into account log messages that are
--- received in the current interval but emitted before it.
-local grace_interval = (read_config('grace_interval') or 0) + 0
-
-local error_counters = {}
-local enter_at
-local start_time = os.time()
-
-local function convert_to_sec(ns)
-    return math.floor(ns/1e9)
-end
-
-function process_message ()
-    -- timestamp values should be converted to seconds because log timestamps
-    -- have a precision of one second (or millisecond sometimes)
-    if convert_to_sec(read_message('Timestamp')) + grace_interval < math.max(convert_to_sec(enter_at or 0), start_time) then
-        -- skip the log message if it doesn't fall into the current interval
-        return 0
-    end
-
-    local payload = read_message('Payload')
-    if not payload then
-        return 0
-    end
-
-    -- example of kern.log lines:
-    -- <3>Jul 24 14:42:21 node-164 kernel: [505801.068621] Buffer I/O error on device sdd2, logical block 51184
-    -- <4>Aug 22 09:37:09 node-164 kernel: [767975.369264] XFS (sda): xfs_log_force: error 5 returned.
-    -- <1>May 17 23:07:11 sd-os1-stor05 kernel: [ 2119.105909] XFS (sdf3): metadata I/O error: block 0x68c2b7d8 ("xfs_trans_read_buf_map") error 121 numblks 8
-    for _, pattern in ipairs(patterns) do
-        local ok, device = pcall(string.match, payload, pattern)
-        if not ok then
-            return -1, device
-        end
-        if device then
-            error_counters[device] = (error_counters[device] or 0) + 1
-            break
-        end
-    end
-    return 0
-end
-
-function timer_event(ns)
-    -- Is error_counters empty?
-    if next(error_counters) == nil then
-        return 0
-    end
-
-    local delta_sec = (ns - (enter_at or 0)) / 1e9
-    for dev, value in pairs(error_counters) do
-        -- Don`t send values from first ticker interval
-        if enter_at ~= nil then
-            utils.add_to_bulk_metric("hdd_errors_rate", value / delta_sec, {device=dev})
-        end
-        error_counters[dev] = 0
-    end
-
-    enter_at = ns
-    utils.inject_bulk_metric(ns, hostname, 'hdd_errors_filter')
-
-    return 0
-end
\ No newline at end of file
diff --git a/heka/files/lua/filters/heka_monitoring.lua b/heka/files/lua/filters/heka_monitoring.lua
deleted file mode 100644
index 35efcad..0000000
--- a/heka/files/lua/filters/heka_monitoring.lua
+++ /dev/null
@@ -1,85 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'cjson'
-require 'string'
-require 'math'
-local utils  = require 'lma_utils'
-
-function process_table(typ, array)
-    -- NOTE: It has been written for "filters" and "decoders". If we need to
-    -- use it to collect metrics from other components  of the Heka pipeline,
-    -- we need to ensure that JSON provides names and table with
-    -- ProcessMessageCount and ProcessMessageAvgDuration:
-    --
-    --    "decoder": {
-    --        ...
-    --        },
-    --        "Name": "a name",
-    --        "ProcessMessageCount" : {
-    --            "representation": "count",
-    --            "value": 12
-    --        },
-    --        "ProcessMessageAvgDuration" : {
-    --            "representation": "ns",
-    --            "value": 192913
-    --        },
-    --        { ... }}
-    --
-    for _, v in pairs(array) do
-        if type(v) == "table" then
-            -- strip off the '_decoder'/'_filter' suffix
-            local name = v['Name']:gsub("_" .. typ, "")
-
-            local tags = {
-                ['type'] = typ,
-                ['name'] = name,
-            }
-
-            utils.add_to_bulk_metric('hekad_msg_count', v.ProcessMessageCount.value, tags)
-            utils.add_to_bulk_metric('hekad_msg_avg_duration', v.ProcessMessageAvgDuration.value, tags)
-            if v.Memory then
-                utils.add_to_bulk_metric('hekad_memory', v.Memory.value, tags)
-             end
-            if v.TimerEventAvgDuration then
-                utils.add_to_bulk_metric('hekad_timer_event_avg_duration', v.TimerEventAvgDuration.value, tags)
-            end
-            if v.TimerEventSamples then
-                utils.add_to_bulk_metric('hekad_timer_event_count', v.TimerEventSamples.value, tags)
-            end
-        end
-    end
-end
-
-function singularize(str)
-    return str:gsub('s$', '')
-end
-
-function process_message ()
-    local ok, data = pcall(cjson.decode, read_message("Payload"))
-    if not ok then
-        return -1
-    end
-
-    local hostname = read_message("Hostname")
-    local ts = read_message("Timestamp")
-
-    for k, v in pairs(data) do
-        if k == "filters" or k == "decoders" then
-            process_table(singularize(k), v)
-        end
-    end
-
-    utils.inject_bulk_metric(ts, hostname, 'heka_monitoring')
-    return 0
-end
diff --git a/heka/files/lua/filters/http_metrics_aggregator.lua b/heka/files/lua/filters/http_metrics_aggregator.lua
deleted file mode 100644
index 1756a59..0000000
--- a/heka/files/lua/filters/http_metrics_aggregator.lua
+++ /dev/null
@@ -1,185 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-require 'string'
-require 'math'
-require 'os'
-local utils = require 'lma_utils'
-local tab = require 'table_utils'
-local table = require 'table'
-
-local hostname = read_config('hostname') or error('hostname must be specified')
-local interval = (read_config('interval') or error('interval must be specified')) + 0
--- max_timer_inject is the maximum number of injected messages by timer_event()
-local max_timer_inject = (read_config('max_timer_inject') or 10) + 0
--- bulk_size is the maximum number of metrics embedded by a bulk_metric within the Payload.
--- The bulk_size depends on the hekad max_message_size (64 KB by default).
--- At most, there are 45 metrics/service * 300B (per bucket) =~ 13KB * 4 services = 52KB for 225 metrics.
--- With a max_message_size set to 256KB, it's possible to embed more than 800 metrics.
-local bulk_size = (read_config('bulk_size') or 225) + 0
-local percentile_thresh = (read_config('percentile') or 90) + 0
--- grace_time is used to palliate the time precision difference
--- (in second or millisecond for logs versus nanosecond for the ticker)
--- and also to compensate the delay introduced by log parsing/decoding
--- which leads to arrive too late in its interval.
-local grace_time = (read_config('grace_time') or 0) + 0
-
-local inject_reached_error = 'too many metrics to aggregate, adjust bulk_size and/or max_timer_inject parameters'
-
-local percentile_field_name = string.format('upper_%s', percentile_thresh)
-local msg_source = 'http_metric_filter'
-local last_tick = os.time() * 1e9
-local interval_in_ns = interval * 1e9
-
-local http_verbs = {
-    GET = true,
-    POST = true,
-    OPTIONS = true,
-    DELETE = true,
-    PUT = true,
-    HEAD = true,
-    TRACE = true,
-    CONNECT = true,
-    PATCH = true,
-}
-
-local metric_bucket = {
-    min = 0,
-    max = 0,
-    sum = 0,
-    count = 0,
-    times = {},
-    [percentile_field_name] = 0,
-    rate = 0,
-}
-local all_times = {}
-local num_metrics = 0
-
-function process_message ()
-    local severity = read_message("Fields[severity_label]")
-    local logger = read_message("Logger")
-    local timestamp = read_message("Timestamp")
-    local http_method = read_message("Fields[http_method]")
-    local http_status = read_message("Fields[http_status]")
-    local response_time = read_message("Fields[http_response_time]")
-
-    if timestamp < last_tick - grace_time then
-        -- drop silently old logs
-        return 0
-    end
-    if http_method == nil or http_status == nil or response_time == nil then
-        return -1
-    end
-
-    -- keep only the first 2 tokens because some services like Neutron report
-    -- themselves as 'openstack.<service>.server'
-    local service = string.gsub(read_message("Logger"), '(%w+)%.(%w+).*', '%1_%2')
-    if service == nil then
-        return -1, "Cannot match any service from " .. logger
-    end
-
-    -- coerce http_status to integer
-    http_status = http_status + 0
-    local http_status_family
-    if http_status >= 100 and http_status < 200 then
-        http_status_family = '1xx'
-    elseif http_status >= 200 and http_status < 300 then
-        http_status_family = '2xx'
-    elseif http_status >= 300 and http_status < 400 then
-        http_status_family = '3xx'
-    elseif http_status >= 400 and http_status < 500 then
-        http_status_family = '4xx'
-    elseif http_status >= 500 and http_status < 600 then
-        http_status_family = '5xx'
-    else
-        return -1, "Unsupported http_status " .. http_status
-    end
-
-    if not http_verbs[http_method] then
-        return -1, "Unsupported http_method " .. http_method
-    end
-
-    if not all_times[service] then
-        all_times[service] = {}
-    end
-    if not all_times[service][http_method] then
-        all_times[service][http_method] = {}
-    end
-    if not all_times[service][http_method][http_status_family] then
-        -- verify that the sandbox has enough capacity to emit all metrics
-        if num_metrics > (bulk_size * max_timer_inject) then
-            return -1, inject_reached_error
-        end
-        all_times[service][http_method][http_status_family] = tab.deepcopy(metric_bucket)
-        num_metrics = num_metrics + 1
-    end
-
-    local bucket = all_times[service][http_method][http_status_family]
-    bucket.times[#bucket.times + 1] = response_time
-    bucket.count = bucket.count + 1
-    bucket.sum = bucket.sum + response_time
-    if bucket.max < response_time then
-        bucket.max = response_time
-    end
-    if bucket.min == 0 or bucket.min > response_time then
-        bucket.min = response_time
-    end
-
-    return 0
-end
-
-function timer_event(ns)
-
-    last_tick = ns
-
-    local num = 0
-    local msg_injected = 0
-    for service, methods in pairs(all_times) do
-        for method, statuses in pairs(methods) do
-            for status, bucket in pairs(statuses) do
-                local metric_name = service .. '_http_response_times'
-                bucket.rate = bucket.count / interval
-                bucket[percentile_field_name] = bucket.max
-                if bucket.count > 1 then
-                    table.sort(bucket.times)
-                    local tmp = ((100 - percentile_thresh) / 100) * bucket.count
-                    local idx = bucket.count - math.floor(tmp + .5)
-                    if idx > 0 and bucket.times[idx] then
-                        bucket[percentile_field_name] = bucket.times[idx]
-                    end
-                end
-                bucket.times = nil
-                utils.add_to_bulk_metric(metric_name, bucket, {hostname=hostname, http_method=method, http_status=status})
-                all_times[service][method][status] = nil
-                num = num + 1
-                num_metrics = num_metrics - 1
-                if num >= bulk_size then
-                    if msg_injected < max_timer_inject then
-                        utils.inject_bulk_metric(ns, hostname, msg_source)
-                        msg_injected = msg_injected + 1
-                        num = 0
-                        num_metrics = 0
-                    end
-                end
-            end
-            all_times[service][method] = nil
-        end
-        all_times[service] = nil
-    end
-    if num > 0 then
-        utils.inject_bulk_metric(ns, hostname, msg_source)
-        num = 0
-        num_metrics = 0
-    end
-end
diff --git a/heka/files/lua/filters/influxdb_accumulator.lua b/heka/files/lua/filters/influxdb_accumulator.lua
deleted file mode 100644
index 470bdef..0000000
--- a/heka/files/lua/filters/influxdb_accumulator.lua
+++ /dev/null
@@ -1,142 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'cjson'
-require 'os'
-require 'string'
-require 'table'
-local utils = require 'lma_utils'
-local Accumulator = require 'accumulator'
-local Influxdb = require 'influxdb'
-local l = require 'lpeg'
-l.locale(l)
-
-local flush_count = (read_config('flush_count') or 100) + 0
-local flush_interval = (read_config('flush_interval') or 5) + 0
-local time_precision = read_config("time_precision")
-local payload_name = read_config("payload_name") or "influxdb"
-local bulk_metric_type_matcher = read_config("bulk_metric_type_matcher") or "bulk_metric$"
-
--- the tag_fields parameter is a list of tags separated by spaces
-local tag_grammar = l.Ct((l.C((l.P(1) - l.P" ")^1) * l.P" "^0)^0)
-local tag_fields = tag_grammar:match(read_config("tag_fields") or "")
-
-function flush_cb(datapoints)
-    if #datapoints > 0 then
-        datapoints[#datapoints+1] = ''
-        utils.safe_inject_payload("txt", payload_name, table.concat(datapoints, "\n"))
-    end
-end
-local accumulator = Accumulator.new(flush_count, flush_interval, flush_cb)
-local encoder = Influxdb.new(time_precision)
-
--- return a table containing the common tags from the message
-function get_common_tags()
-    local tags = {}
-    for _, t in ipairs(tag_fields) do
-        tags[t] = read_message(string.format('Fields[%s]', t))
-    end
-    return tags
-end
-
--- process a single metric
-function process_single_metric()
-    local name = read_message("Fields[name]")
-
-    if not name then
-        return 'Fields[name] is missing'
-    end
-    local ok, value = utils.get_values_from_metric()
-    if not ok then
-        return value
-    end
-
-    -- collect tags from Fields[tag_fields]
-    local tags = get_common_tags()
-    local i = 0
-    while true do
-        local t = read_message("Fields[tag_fields]", 0, i)
-        if not t then
-            break
-        end
-        tags[t] = read_message(string.format('Fields[%s]', t))
-        i = i + 1
-    end
-
-    accumulator:append(
-        encoder:encode_datapoint(
-            read_message('Timestamp'),
-            name,
-            value,
-            tags))
-    return
-end
-
-function process_bulk_metric()
-    -- The payload of the message contains a list of datapoints.
-    --
-    -- Each point is formatted either like this:
-    --
-    --  {name='foo',
-    --   value=1,
-    --   tags={k1=v1,...}}
-    --
-    -- or like this for multi-value points:
-    --
-    --  {name='bar',
-    --   values={k1=v1, ..},
-    --   tags={k1=v1,...}
-    --
-    local ok, points = pcall(cjson.decode, read_message("Payload"))
-    if not ok then
-        return 'Invalid payload value for bulk metric'
-    end
-
-    local common_tags = get_common_tags()
-    local msg_timestamp = read_message('Timestamp')
-    for _, point in ipairs(points) do
-        point.tags = point.tags or {}
-        for k,v in pairs(common_tags) do
-            if point.tags[k] == nil then
-                point.tags[k] = v
-            end
-        end
-        accumulator:append(
-            encoder:encode_datapoint(
-                msg_timestamp,
-                point.name,
-                point.value or point.values,
-                point.tags))
-    end
-    return
-end
-
-function process_message()
-    local err_msg
-    local msg_type = read_message("Type")
-    if msg_type:match(bulk_metric_type_matcher) then
-        err_msg = process_bulk_metric()
-    else
-        err_msg = process_single_metric()
-    end
-
-    if err_msg then
-        return -1, err_msg
-    else
-        return 0
-    end
-end
-
-function timer_event(ns)
-    accumulator:flush(ns)
-end
diff --git a/heka/files/lua/filters/influxdb_annotation.lua b/heka/files/lua/filters/influxdb_annotation.lua
deleted file mode 100644
index a1f33ee..0000000
--- a/heka/files/lua/filters/influxdb_annotation.lua
+++ /dev/null
@@ -1,92 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'cjson'
-require 'string'
-require 'table'
-
-local utils  = require 'lma_utils'
-local consts = require 'gse_constants'
-local afd = require 'afd'
-
-local measurement_name = read_config('measurement_name') or 'annotations'
-local html_break_line = '<br />'
-
-local statuses = {}
-
--- Transform a GSE cluster metric into an annotation stored into InfluxDB
-function process_message ()
-    local previous
-    local text
-    local cluster = afd.get_entity_name('cluster_name')
-    local status = afd.get_status()
-    local alarms = afd.extract_alarms()
-
-    if not cluster or not status or not alarms then
-        return -1
-    end
-
-    if not statuses[cluster] then
-        statuses[cluster] = {}
-    end
-    previous = statuses[cluster]
-
-    text = table.concat(afd.alarms_for_human(alarms), html_break_line)
-
-    -- build the title
-    if not previous.status and status == consts.OKAY then
-        -- don't send an annotation when we detect a new cluster which is OKAY
-        return 0
-    elseif not previous.status then
-        title = string.format('General status is %s',
-                              consts.status_label(status))
-    elseif previous.status ~= status then
-        title = string.format('General status %s -> %s',
-                              consts.status_label(previous.status),
-                              consts.status_label(status))
--- TODO(pasquier-s): generate an annotation when the set of alarms has changed.
--- the following code generated an annotation whenever at least one value
--- associated to an alarm was changing. This led to way too many annotations
--- with alarms monitoring the CPU usage for instance.
---    elseif previous.text ~= text then
---        title = string.format('General status remains %s',
---                              consts.status_label(status))
-    else
-        -- nothing has changed since the last message
-        return 0
-    end
-
-    local msg = {
-        Timestamp = read_message('Timestamp'),
-        Type = 'metric',
-        Severity = utils.label_to_severity_map.INFO,
-        Hostname = read_message('Hostname'),
-        Fields = {
-            name = measurement_name,
-            tag_fields = { 'cluster' },
-            value_fields = { 'title', 'tags', 'text' },
-            title = title,
-            tags = cluster,
-            text = text,
-            cluster = cluster,
-            source = 'influxdb_annotation'
-      }
-    }
-    utils.inject_tags(msg)
-
-    -- store the last status and alarm text for future messages
-    previous.status = status
-    previous.text = text
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/filters/instance_state.lua b/heka/files/lua/filters/instance_state.lua
deleted file mode 100644
index 9354267..0000000
--- a/heka/files/lua/filters/instance_state.lua
+++ /dev/null
@@ -1,48 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local utils = require 'lma_utils'
-
-local msg = {
-    Type = "metric", -- will be prefixed by "heka.sandbox."
-    Timestamp = nil,
-    Severity = 6,
-}
-
-count = 0
-
-function process_message ()
-    local state = read_message("Fields[state]")
-    local old_state = read_message("Fields[old_state]")
-    if old_state ~= nil and state == old_state then
-        -- nothing to do
-        return 0
-    end
-    msg.Timestamp = read_message("Timestamp")
-    msg.Fields = {
-        source = read_message('Logger'),
-        name = "openstack_nova_instance_state",
-        -- preserve the original hostname in the Fields attribute because
-        -- sandboxed filters cannot override the Hostname attribute
-        hostname = read_message("Fields[hostname]"),
-        type = utils.metric_type['COUNTER'],
-        value = 1,
-        tenant_id = read_message("Fields[tenant_id]"),
-        user_id = read_message("Fields[user_id]"),
-        state = state,
-        tag_fields = { 'state', 'hostname' },
-    }
-    utils.inject_tags(msg)
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/filters/logs_counter.lua b/heka/files/lua/filters/logs_counter.lua
deleted file mode 100644
index 7da74e9..0000000
--- a/heka/files/lua/filters/logs_counter.lua
+++ /dev/null
@@ -1,134 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-require 'math'
-require 'os'
-require 'string'
-local utils = require 'lma_utils'
-
-local hostname = read_config('hostname') or error('hostname must be specified')
-local interval = (read_config('interval') or error('interval must be specified')) + 0
--- Heka cannot guarantee that logs are processed in real-time so the
--- grace_interval parameter allows to take into account log messages that are
--- received in the current interval but emitted before it.
-local grace_interval = (read_config('grace_interval') or 0) + 0
-
-local discovered_services = {}
-local logs_counters = {}
-local last_timer_events = {}
-local current_service = 1
-local enter_at
-local interval_in_ns = interval * 1e9
-local start_time = os.time()
-local msg = {
-    Type = "metric",
-    Timestamp = nil,
-    Severity = 6,
-}
-
-function convert_to_sec(ns)
-    return math.floor(ns/1e9)
-end
-
-function process_message ()
-    local severity = read_message("Fields[severity_label]")
-    local logger = read_message("Logger")
-
-    local service = string.match(logger, "^openstack%.(%a+)$")
-    if service == nil then
-        return -1, "Cannot match any services from " .. logger
-    end
-
-    -- timestamp values should be converted to seconds because log timestamps
-    -- have a precision of one second (or millisecond sometimes)
-    if convert_to_sec(read_message('Timestamp')) + grace_interval < math.max(convert_to_sec(last_timer_events[service] or 0), start_time) then
-        -- skip the the log message if it doesn't fall into the current interval
-        return 0
-    end
-
-    if not logs_counters[service] then
-        -- a new service has been discovered
-        discovered_services[#discovered_services + 1] = service
-        logs_counters[service] = {}
-        for _, label in pairs(utils.severity_to_label_map) do
-            logs_counters[service][label] = 0
-        end
-    end
-
-    logs_counters[service][severity] = logs_counters[service][severity] + 1
-
-    return 0
-end
-
-function timer_event(ns)
-
-    -- We can only send a maximum of ten events per call.
-    -- So we send all metrics about one service and we will proceed with
-    -- the following services at the next ticker event.
-
-    if #discovered_services == 0 then
-        return 0
-    end
-
-    -- Initialize enter_at during the first call to timer_event
-    if not enter_at then
-        enter_at = ns
-    end
-
-    -- To be able to send a metric we need to check if we are within the
-    -- interval specified in the configuration and if we haven't already sent
-    -- all metrics.
-    if ns - enter_at < interval_in_ns and current_service <= #discovered_services then
-        local service_name = discovered_services[current_service]
-        local last_timer_event = last_timer_events[service_name] or 0
-        local delta_sec = (ns - last_timer_event) / 1e9
-
-        for level, val in pairs(logs_counters[service_name]) do
-
-           -- We don't send the first value
-           if last_timer_event ~= 0 and delta_sec ~= 0 then
-               msg.Timestamp = ns
-               msg.Fields = {
-                   name = 'log_messages',
-                   type = utils.metric_type['DERIVE'],
-                   value = val / delta_sec,
-                   service = service_name,
-                   level = string.lower(level),
-                   hostname = hostname,
-                   tag_fields = {'service', 'level', 'hostname'},
-               }
-
-               utils.inject_tags(msg)
-               ok, err = utils.safe_inject_message(msg)
-               if ok ~= 0 then
-                 return -1, err
-               end
-           end
-
-           -- reset the counter
-           logs_counters[service_name][level] = 0
-
-        end
-
-        last_timer_events[service_name] = ns
-        current_service = current_service + 1
-    end
-
-    if ns - enter_at >= interval_in_ns then
-        enter_at = ns
-        current_service = 1
-    end
-
-    return 0
-end
diff --git a/heka/files/lua/filters/resource_creation_time.lua b/heka/files/lua/filters/resource_creation_time.lua
deleted file mode 100644
index 0047ed3..0000000
--- a/heka/files/lua/filters/resource_creation_time.lua
+++ /dev/null
@@ -1,82 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'math'
-local patt = require 'patterns'
-local utils = require 'lma_utils'
-
-local msg = {
-    Type = "metric", -- will be prefixed by "heka.sandbox."
-    Timestamp = nil,
-    Severity = 6,
-}
-
-local event_type_to_name = {
-    ["compute.instance.create.end"] = "openstack_nova_instance_creation_time",
-    ["volume.create.end"] = "openstack_cinder_volume_creation_time",
-    ["volume.attach.end"] = "openstack_cinder_volume_attachment_time",
-}
-
-function process_message ()
-    local metric_name = event_type_to_name[read_message("Fields[event_type]")]
-    if not metric_name then
-        return -1
-    end
-
-    local started_at, completed_at
-
-    if metric_name == "openstack_cinder_volume_attachment_time" then
-        --[[ To compute the metric we need fields that are not available
-          directly in the Heka message. So we need to decode the message,
-          check if it is a full notification or not and extract the needed
-          values. ]]--
-        local data = read_message("Payload")
-        local ok, notif = pcall(cjson.decode, data)
-        if not ok then
-          return -1
-        end
-
-        notif = notif.payload or notif
-        local t = unpack(notif['volume_attachment'])
-        started_at   = t.created_at or ''
-        completed_at = t.attach_time or ''
-    else
-        started_at = read_message("Fields[created_at]") or ''
-        completed_at = read_message("Fields[launched_at]") or ''
-    end
-
-    started_at = patt.Timestamp:match(started_at)
-    completed_at = patt.Timestamp:match(completed_at)
-    if started_at == nil or completed_at == nil or started_at == 0 or completed_at == 0 or started_at > completed_at then
-        return -1
-    end
-
-    msg.Timestamp = read_message("Timestamp")
-    msg.Fields = {
-        source = read_message('Logger'),
-        name = metric_name,
-        -- preserve the original hostname in the Fields attribute because
-        -- sandboxed filters cannot override the Hostname attribute
-        hostname = read_message("Fields[hostname]"),
-        type = utils.metric_type['GAUGE'],
-        -- Having a millisecond precision for creation time is good enough given
-        -- that the started_at field has only a 1-second precision.
-        value = {value = math.floor((completed_at - started_at)/1e6 + 0.5) / 1e3, representation = 's'},
-        tenant_id = read_message("Fields[tenant_id]"),
-        user_id = read_message("Fields[user_id]"),
-        tag_fields = {'hostname'},
-    }
-    utils.inject_tags(msg)
-
-    return utils.safe_inject_message(msg)
-end
diff --git a/heka/files/lua/filters/watchdog.lua b/heka/files/lua/filters/watchdog.lua
deleted file mode 100644
index 0399d5c..0000000
--- a/heka/files/lua/filters/watchdog.lua
+++ /dev/null
@@ -1,24 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require 'math'
-
-local payload_name = read_config('payload_name') or error('payload_name is required')
-local payload = read_config('payload')
-
--- Very simple filter that emits a fixed message or the current timestamp (in
--- second) every ticker interval. It can be used to check the liveness of the
--- Heka service.
-function timer_event(ns)
-   inject_payload("txt", payload_name, payload or math.floor(ns / 1e9))
-end
diff --git a/heka/files/lua/outputs/lastfile.lua b/heka/files/lua/outputs/lastfile.lua
deleted file mode 100644
index 28335a5..0000000
--- a/heka/files/lua/outputs/lastfile.lua
+++ /dev/null
@@ -1,27 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-require "io"
-
-local path = read_config('path') or error('path required')
-local field = read_config('field') or 'Payload'
-
--- Very simple output sandbox that writes the value of one of the message's
--- fields ('Payload' by default) to a file.
-function process_message()
-    local fh = io.open(path, "w")
-    io.output(fh)
-    io.write(read_message(field))
-    io.close()
-    return 0
-end
diff --git a/heka/files/toml/output/amqp.toml b/heka/files/output/amqp.toml
similarity index 87%
rename from heka/files/toml/output/amqp.toml
rename to heka/files/output/amqp.toml
index 80f2106..5932b71 100644
--- a/heka/files/toml/output/amqp.toml
+++ b/heka/files/output/amqp.toml
@@ -1,4 +1,4 @@
-[{{ output_name }}_output]
+[AMQPOutput_{{ name }}]
 type = "AMQPOutput"
 url = "amqp{% if values.ssl is defined and values.ssl.get('enabled', True) %}s{% endif %}://{{ values.user }}:{{ values.password }}@{{ values.host }}/{{ values.vhost }}"
 exchange = "{{ values.exchange }}"
@@ -7,16 +7,20 @@
 use_framing = true
 encoder = "{{ values.encoder }}"
 
-[{{ output_name }}_output.retries]
+[AMQPOutput_{{ name }}.retries]
 max_delay = "{{ values.get('max_delay', '30s') }}"
 delay = "{{ values.get('delay', '250ms') }}"
 max_retries = {{ values.get('max_retries', '-1') }}
 
 {%- if values.ssl is defined and values.ssl.get('enabled', True) %}
-[{{ output_name }}_output.tls]
+[AMQPOutput_{{ name }}.tls]
 cert_file = "{{ values.ssl.cert_file }}"
 key_file = "{{ values.ssl.key_file }}"
 {%- if values.ssl.ca_file is defined %}
 root_cafile = "{{ values.ssl.ca_file }}"
 {%- endif %}
 {%- endif %}
+
+{#-
+vim: syntax=jinja
+-#}
diff --git a/heka/files/output/dashboard.toml b/heka/files/output/dashboard.toml
new file mode 100644
index 0000000..72c74c1
--- /dev/null
+++ b/heka/files/output/dashboard.toml
@@ -0,0 +1,5 @@
+[DashboardOutput]
+{%- if values.dashboard_address is defined %}
+address = "{{ values.dashboard_address }}:{{ values.dashboard_port }}"
+{% endif %}
+ticker_interval = {{ values.ticker_interval }}
diff --git a/heka/files/output/elasticsearch.toml b/heka/files/output/elasticsearch.toml
new file mode 100644
index 0000000..7d00888
--- /dev/null
+++ b/heka/files/output/elasticsearch.toml
@@ -0,0 +1,13 @@
+[output_{{ name }}]
+type = "ElasticSearchOutput"
+message_matcher = "{{ values.message_matcher }}"
+encoder = "{{ values.encoder }}"
+server = "http://{{ values.host }}:{{ values.port }}"
+flush_interval = {{ values.flush_interval }}
+flush_count = {{ values.flush_count }}
+
+[output_{{ name }}.buffering]
+max_file_size = 16777216 #16M
+max_buffer_size = 67108864 #64M
+full_action = "block"
+cursor_update_count = 100
diff --git a/heka/files/output/logoutput.toml b/heka/files/output/logoutput.toml
new file mode 100644
index 0000000..0df4f54
--- /dev/null
+++ b/heka/files/output/logoutput.toml
@@ -0,0 +1,3 @@
+[LogOutput]
+encoder = "{{ values.encoder }}"
+message_matcher = "{{ values.message_matcher }}"
diff --git a/heka/files/service_wrapper b/heka/files/service_wrapper
deleted file mode 100644
index f3532f1..0000000
--- a/heka/files/service_wrapper
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-HEKAD="/usr/bin/hekad"
-
-exec $HEKAD -config=/etc/{{ service_name }}
diff --git a/heka/files/toml/decoder/multidecoder.toml b/heka/files/toml/decoder/multidecoder.toml
deleted file mode 100644
index 3ac53c9..0000000
--- a/heka/files/toml/decoder/multidecoder.toml
+++ /dev/null
@@ -1,5 +0,0 @@
-[{{ decoder_name }}_decoder]
-type = "MultiDecoder"
-subs = {{ decoder.subs }}
-cascade_strategy = "{{ decoder.cascade_strategy }}"
-log_sub_errors = {{ decoder.log_sub_errors }}
diff --git a/heka/files/toml/decoder/payloadregex.toml b/heka/files/toml/decoder/payloadregex.toml
deleted file mode 100644
index 3e791bd..0000000
--- a/heka/files/toml/decoder/payloadregex.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-[{{ decoder_name }}_decoder]
-type = "PayloadRegexDecoder"
-match_regex = "{{ decoder.match_regex }}"
-timestamp_layout = "{{ decoder.timestamp_layout }}"
diff --git a/heka/files/toml/decoder/protobuf.toml b/heka/files/toml/decoder/protobuf.toml
deleted file mode 100644
index 9c5ccac..0000000
--- a/heka/files/toml/decoder/protobuf.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[{{ decoder_name }}_decoder]
-type = "ProtobufDecoder"
diff --git a/heka/files/toml/decoder/sandbox.toml b/heka/files/toml/decoder/sandbox.toml
deleted file mode 100644
index c073991..0000000
--- a/heka/files/toml/decoder/sandbox.toml
+++ /dev/null
@@ -1,30 +0,0 @@
-{%- from "heka/map.jinja" import server with context %}
-
-[{{ decoder_name }}_decoder]
-type = "SandboxDecoder"
-filename = "{{ decoder.module_file }}"
-{%- if decoder.module_dir is defined %}
-module_directory = "{{ decoder.module_dir }}"
-{%- endif %}
-{%- if decoder.memory_limit is defined %}
-memory_limit = "{{ decoder.memory_limit }}"
-{%- endif %}
-{%- if decoder.preserve_data is defined %}
-preserve_data = "{{ decoder.preserve_data }}"
-{%- endif %}
-{%- if decoder.instruction_limit is defined %}
-instruction_limit = "{{ decoder.instruction_limit }}"
-{%- endif %}
-{%- if decoder.output_limit is defined %}
-output_limit = "{{ decoder.output_limit }}"
-{%- endif %}
-
-{%- if decoder.config is defined or decoder.get('adjust_timezone', False) %}
-[{{ decoder_name }}_decoder.config]
-{%- for config_param, config_value in decoder.get('config', {}).iteritems() %}
-{{ config_param }} = {% if config_value is string %}"{{ config_value }}"{% elif config_value in [True, False] %}{{ config_value|lower }}{% else %}{{ config_value }}{% endif %}
-{%- endfor %}
-{%- if decoder.get('adjust_timezone') and server.timezone is defined %}
-tz = "{{ server.timezone }}"
-{%- endif %}
-{%- endif %}
diff --git a/heka/files/toml/encoder/elasticsearch.toml b/heka/files/toml/encoder/elasticsearch.toml
deleted file mode 100644
index d91d07a..0000000
--- a/heka/files/toml/encoder/elasticsearch.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[{{ encoder_name }}_encoder]
-type = "ESJsonEncoder"
-{%- if encoder.index is defined %}
-index = "{{ encoder.index }}"
-{%- else %}
-{% raw %}
-index = "%{Type}-%{%Y.%m.%d}"
-{%- endraw %}
-{%- endif %}
-es_index_from_timestamp = true
-fields = [ "DynamicFields", "Hostname", "Logger", "Payload", "Pid", "Severity", "Timestamp", "Type" ]
diff --git a/heka/files/toml/encoder/payload.toml b/heka/files/toml/encoder/payload.toml
deleted file mode 100644
index b7cc8f4..0000000
--- a/heka/files/toml/encoder/payload.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-[{{ encoder_name }}_encoder]
-type = "PayloadEncoder"
-append_newlines = {{ encoder.get('append_newlines', False)|lower }}
-prefix_ts = {{ encoder.get('prefix_ts', False)|lower }}
diff --git a/heka/files/toml/encoder/sandbox.toml b/heka/files/toml/encoder/sandbox.toml
deleted file mode 100644
index 67c95a1..0000000
--- a/heka/files/toml/encoder/sandbox.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-[{{ encoder_name }}_encoder]
-type = "SandboxEncoder"
-filename = "{{ encoder.module_file }}"
-{%- if encoder.module_dir is defined %}
-module_directory = "{{ encoder.module_dir }}"
-{%- endif %}
-
-{%- if encoder.config is mapping %}
-[{{ encoder_name }}_encoder.config]
-{%- for config_param, config_value in encoder.config.iteritems() %}
-{{ config_param }} = {% if config_value is string %}"{{ config_value }}"{% elif config_value in [True, False] %}{{ config_value|lower }}{% else %}{{ config_value }}{% endif %}
-{%- endfor %}
-{%- endif %}
diff --git a/heka/files/toml/filter/afd_alarm.toml b/heka/files/toml/filter/afd_alarm.toml
deleted file mode 100644
index 5fefb2d..0000000
--- a/heka/files/toml/filter/afd_alarm.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-[afd_{{ alarm_name }}_filter]
-type = "SandboxFilter"
-filename = "/usr/share/lma_collector/filters/afd.lua"
-preserve_data = {{ alarm.preserve_data|default(False)|lower }}
-message_matcher = "(Type == 'metric' || Type == 'heka.sandbox.metric') && ({{ salt['heka_alarming.alarm_message_matcher'](alarm, trigger) }})"
-module_directory = "/usr/share/lma_collector/common;/usr/share/heka/lua_modules"
-ticker_interval = 10
-
-[afd_{{ alarm_name }}_filter.config]
-afd_file = "lma_{{ alarm_name|replace('-', '_') }}"
-afd_name = "{{ alarm_name }}"
-hostname = "{{ grains.host }}"
-dimensions = '{{ salt['heka_alarming.dimensions'](alarm)|json }}'
-{%- set alerting = alarm.get('alerting', 'enabled') %}
-activate_alerting = {{ salt['heka_alarming.alarm_activate_alerting'](alerting) }}
-enable_notification = {{ salt['heka_alarming.alarm_enable_notification'](alerting) }}
diff --git a/heka/files/toml/filter/gse_alarm_cluster.toml b/heka/files/toml/filter/gse_alarm_cluster.toml
deleted file mode 100644
index 1c9fe77..0000000
--- a/heka/files/toml/filter/gse_alarm_cluster.toml
+++ /dev/null
@@ -1,23 +0,0 @@
-[gse_{{ alarm_cluster_name }}_filter]
-type = "SandboxFilter"
-filename = "/usr/share/lma_collector/filters/gse_cluster_filter.lua"
-preserve_data = {{ alarm_cluster.preserve_data|default(False)|lower }}
-message_matcher = "(Type == 'heka.sandbox.afd_metric' || Type == 'heka.sandbox.gse_metric') && ({{ salt['heka_alarming.alarm_cluster_message_matcher'](alarm_cluster) }})"
-module_directory = "/usr/share/lma_collector/common;/usr/share/heka/lua_modules"
-ticker_interval = 1
-
-[gse_{{ alarm_cluster_name }}_filter.config]
-topology_file = "gse_{{ alarm_cluster_name|replace('-', '_') }}_topology"
-dimensions = '{{ salt['heka_alarming.dimensions'](alarm_cluster)|json }}'
-{%- if alarm_cluster.interval is defined %}
-interval = {{ alarm_cluster.interval }}
-{%- endif %}
-{%- if alarm_cluster.max_inject is defined %}
-max_inject = {{ alarm_cluster.max_inject }}
-{%- endif %}
-{%- if alarm_cluster.warm_up_period is defined %}
-warm_up_period = {{ alarm_cluster.warm_up_period }}
-{%- endif %}
-{%- set alerting = alarm_cluster.get('alerting', 'enabled_with_notification') %}
-activate_alerting = {{ salt['heka_alarming.alarm_activate_alerting'](alerting) }}
-enable_notification = {{ salt['heka_alarming.alarm_enable_notification'](alerting) }}
diff --git a/heka/files/toml/filter/sandbox.toml b/heka/files/toml/filter/sandbox.toml
deleted file mode 100644
index 9608e52..0000000
--- a/heka/files/toml/filter/sandbox.toml
+++ /dev/null
@@ -1,25 +0,0 @@
-[{{ filter_name }}_filter]
-type = "SandboxFilter"
-filename = "{{ filter.module_file }}"
-{%- if filter.module_dir is defined %}
-module_directory = "{{ filter.module_dir }}"
-{%- endif %}
-{%- if filter.message_matcher is defined %}
-message_matcher = "{{ filter.message_matcher }}"
-{%- endif %}
-{%- if filter.preserve_data is defined %}
-preserve_data = {{ filter.preserve_data|lower }}
-{%- endif %}
-{%- if filter.ticker_interval is defined %}
-ticker_interval = {{ filter.ticker_interval }}
-{%- endif %}
-{%- if filter.hostname is defined %}
-hostname = "{{ filter.hostname }}"
-{%- endif %}
-
-{%- if filter.config is defined %}
-[{{ filter_name }}_filter.config]
-{%- for config_param, config_value in filter.config.iteritems() %}
-{{ config_param }} = {% if config_value is string %}"{{ config_value }}"{% elif config_value in [True, False] %}{{ config_value|lower }}{% else %}{{ config_value }}{% endif %}
-{%- endfor %}
-{%- endif %}
diff --git a/heka/files/toml/global.toml b/heka/files/toml/global.toml
deleted file mode 100644
index 30d460d..0000000
--- a/heka/files/toml/global.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-[hekad]
-
-{%- set workers = grains.num_cpus + 1 %}
-maxprocs={{ workers }}
-base_dir="/var/cache/{{ service_name }}"
-
-hostname="{{ grains.fqdn.split('.')[0] }}"
-
-max_message_size = 262144
-max_process_inject = 1
-max_timer_inject = 10
-poolsize = {{ poolsize }}
diff --git a/heka/files/toml/input/amqp.toml b/heka/files/toml/input/amqp.toml
deleted file mode 100644
index a6c0160..0000000
--- a/heka/files/toml/input/amqp.toml
+++ /dev/null
@@ -1,39 +0,0 @@
-[{{ input_name }}_input]
-type = "AMQPInput"
-url = "amqp{% if input.ssl is defined and input.ssl.get('enabled', True) %}s{% endif %}://{{ input.user }}:{{ input.password }}@{{ input.host }}:{{ input.port }}/{{ input.vhost }}"
-exchange = "{{ input.exchange }}"
-exchange_type = "{{ input.exchange_type }}"
-{%- if input.prefetch_count is defined %}
-prefetch_count = {{ input.prefetch_count }}
-{%- endif %}
-{%- if input.exchange_durability is defined %}
-exchange_durability = {{ input.exchange_durability|lower }}
-{%- endif %}
-{%- if input.exchange_auto_delete is defined %}
-exchange_auto_delete = {{ input.exchange_auto_delete|lower }}
-{%- endif %}
-{%- if input.queue_auto_delete is defined %}
-queue_auto_delete = {{ input.queue_auto_delete|lower }}
-{%- endif %}
-{%- if input.queue is defined %}
-queue = "{{ input.queue }}"
-{%- endif %}
-{%- if input.routing_key is defined %}
-routing_key = "{{ input.routing_key }}"
-{%- endif %}
-{%- if input.can_exit is defined %}
-can_exit = {{ input.can_exit|lower }}
-{%- endif %}
-decoder = "{{ input.decoder }}"
-{%- if input.splitter is defined %}
-splitter = "{{ input.splitter }}"
-{%- endif %}
-
-{%- if input.ssl is defined and input.ssl.get('enabled', True) %}
-[{{ input_name }}_input.tls]
-cert_file = "{{ input.ssl.cert_file }}"
-key_file = "{{ input.ssl.key_file }}"
-{%- if input.ssl.ca_file is defined %}
-root_cafile = "{{ input.ssl.ca_file }}"
-{%- endif %}
-{%- endif %}
diff --git a/heka/files/toml/input/http.toml b/heka/files/toml/input/http.toml
deleted file mode 100644
index 1a4a8db..0000000
--- a/heka/files/toml/input/http.toml
+++ /dev/null
@@ -1,5 +0,0 @@
-[{{ input_name }}_input]
-type="HttpListenInput"
-address = "{{ input.address }}:{{ input.port }}"
-decoder = "{{ input.decoder }}"
-splitter = '{{ input.splitter }}'
diff --git a/heka/files/toml/input/logstreamer.toml b/heka/files/toml/input/logstreamer.toml
deleted file mode 100644
index 791467e..0000000
--- a/heka/files/toml/input/logstreamer.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[{{ input_name }}_input]
-type = "LogstreamerInput"
-log_directory = "{{ input.log_directory }}"
-file_match = '{{ input.file_match }}'
-{%- if input.differentiator is defined %}
-differentiator = {{ input.differentiator }}
-{%- endif %}
-{%- if input.priority is defined %}
-priority = {{ input.priority }}
-{%- endif %}
-{%- if input.decoder is defined %}
-decoder = "{{ input.decoder }}"
-{%- endif %}
-{%- if input.splitter is defined %}
-splitter = '{{ input.splitter }}'
-{%- endif %}
-{%- if input.oldest_duration is defined %}
-oldest_duration = "{{ input.oldest_duration }}"
-{%- endif %}
diff --git a/heka/files/toml/input/process.toml b/heka/files/toml/input/process.toml
deleted file mode 100644
index 547b4ee..0000000
--- a/heka/files/toml/input/process.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[{{ input_name }}_input]
-type="ProcessInput"
-ticker_interval = {{ input.get('ticker_interval', 30) }}
-{%- if input.decoder is defined %}
-decoder = "{{ input.decoder }}"
-{%- endif %}
-{%- if input.splitter is defined %}
-splitter = "{{ input.get('splitter', 'NullSplitter') }}"
-{%- endif %}
-stdout = {{ input.get('stdout', true)|lower }}
-stderr = {{ input.get('stderr', true)|lower }}
diff --git a/heka/files/toml/input/tcp.toml b/heka/files/toml/input/tcp.toml
deleted file mode 100644
index ba690b0..0000000
--- a/heka/files/toml/input/tcp.toml
+++ /dev/null
@@ -1,5 +0,0 @@
-[{{ input_name }}_input]
-type="TcpInput"
-address = "{{ input.address }}:{{ input.port }}"
-decoder = "{{ input.decoder }}"
-splitter = '{{ input.splitter }}'
diff --git a/heka/files/toml/output/dashboard.toml b/heka/files/toml/output/dashboard.toml
deleted file mode 100644
index f4a6ebe..0000000
--- a/heka/files/toml/output/dashboard.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[DashboardOutput]
-address = "{{ output.host }}:{{ output.port }}"
-ticker_interval = {{ output.get('ticker_interval', 30) }}
diff --git a/heka/files/toml/output/elasticsearch.toml b/heka/files/toml/output/elasticsearch.toml
deleted file mode 100644
index 8240f5f..0000000
--- a/heka/files/toml/output/elasticsearch.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-[{{ output_name }}_output]
-type = "ElasticSearchOutput"
-message_matcher = "{{ output.message_matcher }}"
-encoder = "{{ output.encoder }}"
-server = "{{ output.server }}"
-flush_interval = 5000
-flush_count = 100
-use_buffering = true
-
-[{{ output_name }}_output.buffering]
-max_buffer_size = 1073741824
-max_file_size = 134217728
-full_action = "block"
diff --git a/heka/files/toml/output/http.toml b/heka/files/toml/output/http.toml
deleted file mode 100644
index fce5d97..0000000
--- a/heka/files/toml/output/http.toml
+++ /dev/null
@@ -1,22 +0,0 @@
-[{{ output_name }}_output]
-type = "HttpOutput"
-message_matcher = "{{ output.message_matcher }}"
-encoder = "{{ output.encoder }}"
-address = "{{ output.address }}"
-{%- if output.username and output.password %}
-username = "{{ output.username }}"
-password = "{{ output.password }}"
-{%- endif %}
-http_timeout = {{ output.http_timeout|default(2000) }}
-method = "{{ output.method|default("POST") }}"
-{% if output.get('use_buffering', True) %}
-use_buffering = true
-
-[{{ output_name }}_output.buffering]
-max_buffer_size = {{ output.max_buffer_size|default(268435456) }}
-max_file_size = {{ output.max_file_size|default(67108864) }}
-full_action = "{{ output.full_action|default("drop") }}"
-{% endif %}
-
-[{{ output_name }}_output.headers]
-Content-Type = ["application/x-www-form-urlencoded"]
diff --git a/heka/files/toml/output/log.toml b/heka/files/toml/output/log.toml
deleted file mode 100644
index 9f9f172..0000000
--- a/heka/files/toml/output/log.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[{{ output_name }}_output]
-encoder = "LogOutput"
-message_matcher = "{{ output.message_matcher }}"
diff --git a/heka/files/toml/output/tcp.toml b/heka/files/toml/output/tcp.toml
deleted file mode 100644
index dee7fa0..0000000
--- a/heka/files/toml/output/tcp.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[{{ output_name }}_output]
-type="TcpOutput"
-address = "{{ output.host }}:{{ output.port }}"
-encoder = "ProtobufEncoder"
-message_matcher = "{{ output.message_matcher }}"
-use_buffering = true
-
-[{{ output_name }}_output.buffering]
-max_buffer_size = 268435456
-max_file_size = 67108864
-full_action = "drop"
diff --git a/heka/files/toml/splitter/regex.toml b/heka/files/toml/splitter/regex.toml
deleted file mode 100644
index 0e0297b..0000000
--- a/heka/files/toml/splitter/regex.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-[{{ splitter_name }}_splitter]
-type = "RegexSplitter"
-delimiter = "{{ splitter.delimiter }}"
-delimiter_eol = {{ splitter.delimiter_eol|lower }}
diff --git a/heka/files/toml/splitter/token.toml b/heka/files/toml/splitter/token.toml
deleted file mode 100644
index bbe5464..0000000
--- a/heka/files/toml/splitter/token.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[{{ splitter_name }}_splitter]
-type = "TokenSplitter"
-delimiter = "{{ splitter.delimiter }}"
diff --git a/heka/init.sls b/heka/init.sls
index 7b9a4e5..71d650a 100644
--- a/heka/init.sls
+++ b/heka/init.sls
@@ -1,21 +1,5 @@
-{%- if pillar.heka is defined %}
 include:
-{%- if pillar.heka.server is defined %}
+{% if pillar.heka.server is defined %}
 - heka.server
-{%- endif %}
-{%- if pillar.heka.log_collector is defined %}
-- heka.log_collector
-{%- endif %}
-{%- if pillar.heka.metric_collector is defined %}
-- heka.metric_collector
-{%- endif %}
-{%- if pillar.heka.remote_collector is defined %}
-- heka.remote_collector
-{%- endif %}
-{%- if pillar.heka.ceilometer_collector is defined %}
-- heka.ceilometer_collector
-{%- endif %}
-{%- if pillar.heka.aggregator is defined %}
-- heka.aggregator
-{%- endif %}
-{%- endif %}
+{% endif %}
+
diff --git a/heka/log_collector.sls b/heka/log_collector.sls
deleted file mode 100644
index 9ee007c..0000000
--- a/heka/log_collector.sls
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- if pillar.heka.log_collector is defined %}
-
-include:
-- heka._common
-
-{%- from "heka/map.jinja" import log_collector with context %}
-{%- set server = log_collector %}
-{%- set service_name = "log_collector" %}
-
-{%- include "heka/_service.sls" %}
-
-{%- endif %}
diff --git a/heka/map.jinja b/heka/map.jinja
index 908c5df..cab337d 100644
--- a/heka/map.jinja
+++ b/heka/map.jinja
@@ -3,6 +3,7 @@
   pkgs:
   - acl
   - heka
+  - heka-lua-scripts
   user:
   - heka
   groups:
@@ -14,11 +15,6 @@
   splitter: {}
   encoder: {}
   decoder: {}
-  extra_fields:
-    environment_label: {{ grains.domain }}
-  {%- if pillar.get('linux', {}).get('system', {}).timezone is defined %}
-  timezone: "{{ pillar.linux.system.timezone }}"
-  {%- endif %}
 RedHat:
   groups:
   - adm
@@ -28,73 +24,6 @@
   - acl
   - heka
 {%- endload %}
+
 {%- set server = salt['grains.filter_by'](server_defaults, merge=salt['pillar.get']('heka:server')) %}
 
-{% set default_elasticsearch_port = 9200 %}
-{% set default_influxdb_port = 8086 %}
-{% set default_influxdb_time_precision = 'ms' %}
-{% set default_influxdb_timeout = 5000 %}
-{% set default_aggregator_port = 5565 %}
-{% set default_nagios_port = 8001 %}
-{% set default_nagios_host_alarm_clusters = '00-clusters' %}
-{% set default_automatic_starting = True %}
-
-{% set default_rabbit_port = 5672 %}
-{% set default_rabbit_vhost = '/openstack' %}
-{% set default_ceilometer_rabbit_queue = 'metering.sample' %}
-
-{% set log_collector = salt['grains.filter_by']({
-  'default': {
-    'elasticsearch_port': default_elasticsearch_port,
-    'poolsize': 100,
-    'automatic_starting': default_automatic_starting,
-  }
-}, merge=salt['pillar.get']('heka:log_collector')) %}
-
-{% set metric_collector = salt['grains.filter_by']({
-  'default': {
-    'influxdb_port': default_influxdb_port,
-    'influxdb_time_precision': default_influxdb_time_precision,
-    'influxdb_timeout': default_influxdb_timeout,
-    'aggregator_port': default_aggregator_port,
-    'nagios_port': default_nagios_port,
-    'poolsize': 100,
-    'automatic_starting': default_automatic_starting,
-  }
-}, merge=salt['pillar.get']('heka:metric_collector')) %}
-
-{% set remote_collector = salt['grains.filter_by']({
-  'default': {
-    'influxdb_port': default_influxdb_port,
-    'influxdb_time_precision': default_influxdb_time_precision,
-    'influxdb_timeout': default_influxdb_timeout,
-    'aggregator_port': default_aggregator_port,
-    'poolsize': 100,
-    'automatic_starting': default_automatic_starting,
-  }
-}, merge=salt['pillar.get']('heka:remote_collector')) %}
-
-{% set aggregator = salt['grains.filter_by']({
-  'default': {
-    'influxdb_port': default_influxdb_port,
-    'influxdb_time_precision': default_influxdb_time_precision,
-    'influxdb_timeout': default_influxdb_timeout,
-    'nagios_port': default_nagios_port,
-    'nagios_default_host_alarm_clusters': default_nagios_host_alarm_clusters,
-    'poolsize': 100,
-    'automatic_starting': default_automatic_starting,
-  }
-}, merge=salt['pillar.get']('heka:aggregator')) %}
-
-{% set ceilometer_collector = salt['grains.filter_by']({
-  'default': {
-    'influxdb_port': default_influxdb_port,
-    'influxdb_timeout': default_influxdb_timeout,
-    'influxdb_time_precision': default_influxdb_time_precision,
-    'elasticsearch_port': default_elasticsearch_port,
-    'rabbit_port': default_rabbit_port,
-    'rabbit_vhost': default_rabbit_vhost,
-    'rabbit_queue': default_ceilometer_rabbit_queue,
-    'resource_decoding': False,
-  }
-}, merge=salt['pillar.get']('heka:ceilometer_collector')) %}
diff --git a/heka/meta/collectd.yml b/heka/meta/collectd.yml
deleted file mode 100644
index eda390a..0000000
--- a/heka/meta/collectd.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-{%- if pillar.heka is defined %}
-
-local_plugin:
-  collectd_processes:
-    process:
-{%- if pillar.heka.log_collector is defined %}
-      log_collector:
-        match: 'heka.*log_collector'
-{%- endif %}
-{%- if pillar.heka.metric_collector is defined %}
-      metric_collector:
-        match: 'heka.*metric_collector'
-{%- endif %}
-{%- if pillar.heka.remote_collector is defined %}
-      remote_collector:
-        match: 'heka.*remote_collector'
-{%- endif %}
-{%- if pillar.heka.aggregator is defined %}
-      aggregator:
-        match: 'heka.*aggregator'
-{%- endif %}
-{%- endif %}
diff --git a/heka/meta/heka.yml b/heka/meta/heka.yml
deleted file mode 100644
index 0f16d20..0000000
--- a/heka/meta/heka.yml
+++ /dev/null
@@ -1,520 +0,0 @@
-{%- from "heka/map.jinja" import log_collector with context %}
-{%- from "heka/map.jinja" import metric_collector with context %}
-{%- from "heka/map.jinja" import remote_collector with context %}
-{%- from "heka/map.jinja" import aggregator  with context %}
-{%- from "heka/map.jinja" import ceilometer_collector with context %}
-
-
-log_collector:
-  filter:
-    aggregated_http_metrics:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/http_metrics_aggregator.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      message_matcher: "Type == 'log' && Fields[http_response_time] != NIL"
-      ticker_interval: 10
-      config:
-        hostname: '{{ grains.host }}'
-        interval: 10
-        max_timer_inject: 10
-        bulk_size: 523
-        percentile: 90
-        grace_time: 5
-    log_counter:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/logs_counter.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: true
-      message_matcher: "Type == 'log' && Logger =~ /^openstack\\\\./"
-      ticker_interval: 1
-      config:
-        hostname: '{{ grains.host }}'
-        interval: 60
-        grace_interval: 30
-{%- if log_collector.elasticsearch_host is defined %}
-  encoder:
-    elasticsearch:
-      engine: elasticsearch
-{%- endif %}
-  output:
-    metric_collector:
-      engine: tcp
-      host: 127.0.0.1
-      port: 5567
-      message_matcher: "(Type == 'metric' || Type == 'heka.sandbox.metric' || Type == 'heka.sandbox.bulk_metric')"
-    log_dashboard:
-      engine: dashboard
-      host: 127.0.0.1
-      port: 4352
-      ticker_interval: 30
-{%- if log_collector.elasticsearch_host is defined %}
-    elasticsearch:
-      engine: elasticsearch
-      server: "http://{{ log_collector.elasticsearch_host }}:{{ log_collector.elasticsearch_port }}"
-      encoder: elasticsearch_encoder
-      message_matcher: "Type == 'log'"
-{%- endif %}
-metric_collector:
-  decoder:
-    collectd:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/decoders/collectd.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        hostname: '{{ grains.fqdn.split('.')[0] }}'
-        swap_size: {{ salt['ps.swap_memory']()['total'] }}
-    metric:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/decoders/metric.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        deserialize_bulk_metric_for_loggers: 'aggregated_http_metrics_filter hdd_errors_counter_filter'
-  input:
-    heka_collectd:
-      engine: http
-      address: 127.0.0.1
-      port: 8325
-      decoder: collectd_decoder
-      splitter: NullSplitter
-    heka_metric:
-      engine: tcp
-      address: 0.0.0.0
-      port: 5567
-      decoder: metric_decoder
-      splitter: HekaFramingSplitter
-  filter:
-    heka_metric_collector:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/heka_monitoring.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: false
-      message_matcher: "Type == 'heka.all-report'"
-{%- if metric_collector.influxdb_host is defined %}
-    influxdb_accumulator:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/influxdb_accumulator.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: false
-      message_matcher: "Type =~ /metric$/"
-      ticker_interval: 1
-      config:
-        tag_fields: "deployment_id environment_label tenant_id user_id"
-        time_precision: "{{ metric_collector.influxdb_time_precision }}"
-{%- endif %}
-{%- if metric_collector.influxdb_host is defined %}
-  encoder:
-    influxdb:
-      engine: payload
-      append_newlines: false
-      prefix_ts: false
-{%- endif %}
-{%- if metric_collector.nagios_host is defined %}
-    nagios:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/encoders/status_nagios.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-{%- endif %}
-  output:
-    metric_dashboard:
-      engine: dashboard
-      host: 127.0.0.1
-      port: 4353
-      ticker_interval: 30
-{%- if metric_collector.influxdb_host is defined %}
-    influxdb:
-      engine: http
-      address: "http://{{ metric_collector.influxdb_host }}:{{ metric_collector.influxdb_port }}/write?db={{ metric_collector.influxdb_database }}&precision={{ metric_collector.influxdb_time_precision }}"
-    {%- if metric_collector.influxdb_username and metric_collector.influxdb_password %}
-      username: "{{ metric_collector.influxdb_username }}"
-      password: "{{ metric_collector.influxdb_password }}"
-    {%- endif %}
-      message_matcher: "Fields[payload_type] == 'txt' && Fields[payload_name] == 'influxdb'"
-      encoder: influxdb_encoder
-      timeout: {{ metric_collector.influxdb_timeout }}
-{%- endif %}
-{%- if metric_collector.aggregator_host is defined %}
-    aggregator:
-      engine: tcp
-      host: "{{ metric_collector.aggregator_host }}"
-      port: "{{ metric_collector.aggregator_port }}"
-      message_matcher: "Type == 'heka.sandbox.afd_metric'"
-{%- endif %}
-{%- if metric_collector.nagios_host is defined %}
-    nagios_alarm:
-      engine: http
-      address: "http://{{ metric_collector.nagios_host }}:{{metric_collector.nagios_port }}/status"
-      message_matcher: "Type == 'heka.sandbox.afd_metric' && Fields[no_alerting] == NIL"
-      encoder: nagios_encoder
-      {%- if metric_collector.nagios_username is defined and metric_collector.nagios_password is defined %}
-      username: {{ metric_collector.get('nagios_username') }}
-      password: {{ metric_collector.get('nagios_password') }}
-      {%- endif %}
-      max_buffer_size: 1048576
-      max_file_size: 524288
-      full_action: drop
-{%- endif %}
-remote_collector:
-  decoder:
-    collectd:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/decoders/collectd.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        hostname: '{{ grains.host }}'
-{%- if remote_collector.amqp_host is defined %}
-    notification:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/decoders/notification.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        include_full_notification: false
-{%- endif %}
-  input:
-    heka_collectd:
-      engine: http
-      address: 0.0.0.0
-      port: 8326
-      decoder: collectd_decoder
-      splitter: NullSplitter
-{%- if remote_collector.amqp_host is defined %}
-{%- for notification_level in ('info', 'warn', 'error') %}
-    amqp_notification_{{ notification_level }}:
-      engine: amqp
-      host: {{ remote_collector.amqp_host }}
-      port: {{ remote_collector.amqp_port }}
-      user: {{ remote_collector.amqp_user }}
-      password: {{ remote_collector.amqp_password }}
-      vhost: {{ remote_collector.get('amqp_vhost', '') }}
-      exchange: {{ remote_collector.get('amqp_exchange', 'nova') }}
-      exchange_type: topic
-      exchange_durability: false
-      exchange_auto_delete: false
-      queue_auto_delete: false
-      queue: "{{ remote_collector.amqp_notification_topic }}.{{ notification_level }}"
-      routing_key: "{{ remote_collector.amqp_notification_topic }}.{{ notification_level }}"
-      can_exit: false
-      decoder: notification_decoder
-{%- endfor %}
-{%- endif %}
-{%- if remote_collector.influxdb_host is defined %}
-  filter:
-    influxdb_accumulator:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/influxdb_accumulator.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: false
-      message_matcher: "Type =~ /metric$/"
-      ticker_interval: 1
-      config:
-        tag_fields: "deployment_id environment_label tenant_id user_id"
-        time_precision: "{{ remote_collector.influxdb_time_precision }}"
-{%- endif %}
-{%- if remote_collector.influxdb_host is defined or remote_collector.elasticsearch_host is defined %}
-  encoder:
-{%- if remote_collector.influxdb_host is defined %}
-    influxdb:
-      engine: payload
-      append_newlines: false
-      prefix_ts: false
-{%- endif %}
-{%- if remote_collector.elasticsearch_host is defined %}
-    elasticsearch:
-      engine: elasticsearch
-{%- endif %}
-{%- endif %}
-  output:
-    remote_collector_dashboard:
-      engine: dashboard
-      host: 127.0.0.1
-      port: 4354
-      ticker_interval: 30
-{%- if remote_collector.influxdb_host is defined %}
-    influxdb:
-      engine: http
-      address: "http://{{ remote_collector.influxdb_host }}:{{ remote_collector.influxdb_port }}/write?db={{ remote_collector.influxdb_database }}&precision={{ remote_collector.influxdb_time_precision }}"
-    {%- if remote_collector.influxdb_username and remote_collector.influxdb_password %}
-      username: "{{ remote_collector.influxdb_username }}"
-      password: "{{ remote_collector.influxdb_password }}"
-    {%- endif %}
-      message_matcher: "Fields[payload_type] == 'txt' && Fields[payload_name] == 'influxdb'"
-      encoder: influxdb_encoder
-      timeout: {{ remote_collector.influxdb_timeout }}
-{%- endif %}
-{%- if remote_collector.aggregator_host is defined %}
-    aggregator:
-      engine: tcp
-      host: "{{ remote_collector.aggregator_host }}"
-      port: "{{ remote_collector.aggregator_port }}"
-      message_matcher: "Type == 'heka.sandbox.afd_metric'"
-{%- endif %}
-{%- if remote_collector.elasticsearch_host is defined %}
-    elasticsearch:
-      engine: elasticsearch
-      server: "http://{{ remote_collector.elasticsearch_host }}:{{ remote_collector.elasticsearch_port }}"
-      encoder: elasticsearch_encoder
-      message_matcher: "Type == 'notification'"
-{%- endif %}
-aggregator:
-  policy:
-    # A policy defining that the cluster's status depends on the member with
-    # the highest severity, typically used for a cluster of services.
-    highest_severity:
-    - status: down
-      trigger:
-        logical_operator: or
-        rules:
-        - function: count
-          arguments: [ down ]
-          relational_operator: '>'
-          threshold: 0
-    - status: critical
-      trigger:
-        logical_operator: or
-        rules:
-        - function: count
-          arguments: [ critical ]
-          relational_operator: '>'
-          threshold: 0
-    - status: warning
-      trigger:
-        logical_operator: or
-        rules:
-        - function: count
-          arguments: [ warning ]
-          relational_operator: '>'
-          threshold: 0
-    - status: okay
-      trigger:
-        logical_operator: or
-        rules:
-        - function: count
-          arguments: [ okay ]
-          relational_operator: '>'
-          threshold: 0
-    - status: unknown
-    # A policy which is typically used for clusters managed by Pacemaker
-    # with the no-quorum-policy set to 'stop'.
-    majority_of_members:
-    - status: down
-      trigger:
-        logical_operator: or
-        rules:
-        - function: percent
-          arguments: [ down ]
-          relational_operator: '>'
-          threshold: 50
-    - status: critical
-      trigger:
-        logical_operator: and
-        rules:
-        - function: percent
-          arguments: [ down, critical ]
-          relational_operator: '>'
-          threshold: 20
-        - function: percent
-          arguments: [ okay ]
-          relational_operator: '<'
-          threshold: 50
-          function: percent
-    - status: warning
-      trigger:
-        logical_operator: or
-        rules:
-        - function: percent
-          arguments: [ okay ]
-          relational_operator: '<'
-          threshold: 50
-          function: percent
-    - status: okay
-    # A policy which is typically used for stateless clusters
-    availability_of_members:
-    - status: down
-      trigger:
-        logical_operator: or
-        rules:
-        - function: count
-          arguments: [ okay ]
-          relational_operator: '=='
-          threshold: 0
-    - status: critical
-      trigger:
-        logical_operator: and
-        rules:
-        - function: count
-          arguments: [ okay ]
-          relational_operator: '=='
-          threshold: 1
-        - function: count
-          arguments: [ critical, down ]
-          relational_operator: '>'
-          threshold: 1
-    - status: warning
-      trigger:
-        logical_operator: or
-        rules:
-        - function: percent
-          arguments: [ okay ]
-          relational_operator: '<'
-          threshold: 100
-    - status: okay
-      trigger:
-        logical_operator: or
-        rules:
-        - function: percent
-          arguments: [ okay ]
-          relational_operator: '=='
-          threshold: 100
-    - status: unknown
-  input:
-    heka_metric:
-      engine: tcp
-      address: 0.0.0.0
-      port: 5565
-      decoder: ProtobufDecoder
-      splitter: HekaFramingSplitter
-{%- if aggregator.influxdb_host is defined %}
-  filter:
-    influxdb_accumulator:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/influxdb_accumulator.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: false
-      message_matcher: "Type == 'heka.sandbox.gse_metric' || Type == 'heka.sandbox.metric'"
-      ticker_interval: 1
-      config:
-        tag_fields: "deployment_id environment_label tenant_id user_id"
-        time_precision: "{{ aggregator.influxdb_time_precision }}"
-    influxdb_annotation:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/influxdb_annotation.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: false
-      message_matcher: "Type == 'heka.sandbox.gse_metric'"
-{%- endif %}
-  encoder:
-{%- if aggregator.influxdb_host is defined %}
-    influxdb:
-      engine: payload
-      append_newlines: false
-      prefix_ts: false
-{%- endif %}
-{%- if aggregator.nagios_host is defined %}
-    nagios:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/encoders/status_nagios.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        default_nagios_host: "{{ aggregator.nagios_default_host_alarm_clusters }}"
-        {%- if aggregator.nagios_host_dimension_key is defined %}
-        nagios_host_dimension_key: "{{ aggregator.nagios_host_dimension_key }}"
-        {%- endif %}
-{%- endif %}
-  output:
-{%- if aggregator.influxdb_host is defined %}
-    influxdb:
-      engine: http
-      address: "http://{{ aggregator.influxdb_host }}:{{ aggregator.influxdb_port }}/write?db={{ aggregator.influxdb_database }}&precision={{ aggregator.influxdb_time_precision }}"
-    {%- if aggregator.influxdb_username and aggregator.influxdb_password %}
-      username: "{{ aggregator.influxdb_username }}"
-      password: "{{ aggregator.influxdb_password }}"
-    {%- endif %}
-      message_matcher: "Fields[payload_type] == 'txt' && Fields[payload_name] == 'influxdb'"
-      encoder: influxdb_encoder
-      timeout: {{ aggregator.influxdb_timeout }}
-{%- endif %}
-{%- if aggregator.nagios_host is defined %}
-    nagios_alarm_cluster:
-      engine: http
-      address: "http://{{ aggregator.nagios_host }}:{{aggregator.nagios_port }}/status"
-      message_matcher: "Type == 'heka.sandbox.gse_metric' && Fields[no_alerting] == NIL"
-      encoder: nagios_encoder
-      {%- if aggregator.nagios_username is defined and aggregator.nagios_password is defined %}
-      username: {{ aggregator.get('nagios_username') }}
-      password: {{ aggregator.get('nagios_password') }}
-      {%- endif %}
-      max_buffer_size: 1048576
-      max_file_size: 524288
-      full_action: drop
-{%- endif %}
-ceilometer_collector:
-  decoder:
-    sample:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/decoders/metering.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        decoder: 'ceilometer'
-        decode_resources: {{ ceilometer_collector.resource_decoding|lower }}
-        metadata_fields: "status deleted container_format min_ram updated_at min_disk is_public size checksum created_at disk_format protected instance_host host display_name instance_id instance_type status state user_metadata.stack"
-  input:
-{%- if ceilometer_collector.rabbit_host is defined %}
-    openstack_sample_amqp:
-      engine: amqp
-      user: {{ ceilometer_collector.rabbit_user }}
-      password: {{ ceilometer_collector.rabbit_password }}
-      port: {{ ceilometer_collector.rabbit_port }}
-      host: {{ ceilometer_collector.rabbit_host }}
-      vhost: {{ ceilometer_collector.rabbit_vhost }}
-      queue: {{ ceilometer_collector.rabbit_queue }}
-      routing_key: {{ ceilometer_collector.rabbit_queue }}
-      decoder: sample_decoder
-      splitter: NullSplitter
-      exchange: "ceilometer"
-      exchange_type: "topic"
-      exchange_auto_delete: false
-      queue_auto_delete: false
-{%- endif %}
-  filter:
-{%- if ceilometer_collector.influxdb_host is defined %}
-    ceilometer_influxdb_accumulator:
-      engine: sandbox
-      module_file: /usr/share/lma_collector/filters/influxdb_accumulator.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      preserve_data: false
-      message_matcher: "Type =~ /ceilometer_samples$/"
-      ticker_interval: 1
-      config:
-        time_precision: "{{ ceilometer_collector.influxdb_time_precision }}"
-        payload_name: 'sample_data'
-        flush_count: 500
-        bulk_metric_type_matcher: 'ceilometer_samples'
-{%- endif %}
-  encoder:
-{%- if ceilometer_collector.influxdb_host is defined %}
-    influxdb:
-      engine: payload
-      append_newlines: false
-      prefix_ts: false
-{%- endif %}
-{%- if ceilometer_collector.elasticsearch_host is defined %}
-    elasticsearch_resource:
-      engine: sandbox
-      module_file:  /usr/share/lma_collector/encoders/es_ceilometer_resources.lua
-      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
-      config:
-        index: "ceilometer_resource"
-        type_name: "source"
-        encoder: "elasticsearch_resources"
-{%- endif %}
-{%- if ceilometer_collector.influxdb_host is defined or ceilometer_collector.elasticsearch_host is defined %}
-  output:
-{%- if ceilometer_collector.influxdb_host is defined %}
-    samples_influxdb:
-      engine: http
-      address: "http://{{ ceilometer_collector.influxdb_host }}:{{ ceilometer_collector.influxdb_port }}/write?db={{ ceilometer_collector.influxdb_database }}&precision={{ ceilometer_collector.influxdb_time_precision }}"
-    {%- if ceilometer_collector.influxdb_username and ceilometer_collector.influxdb_password %}
-      username: "{{ ceilometer_collector.influxdb_username }}"
-      password: "{{ ceilometer_collector.influxdb_password }}"
-    {%- endif %}
-      message_matcher: "Fields[payload_type] == 'txt' && Fields[payload_name] == 'sample_data'"
-      encoder: influxdb_encoder
-      timeout: {{ ceilometer_collector.influxdb_timeout }}
-      method: "POST"
-{%- endif %}
-{%- if ceilometer_collector.elasticsearch_host is defined %}
-    elasticsearch_resource:
-      engine: elasticsearch
-      server: "http://{{ ceilometer_collector.elasticsearch_host }}:{{ ceilometer_collector.elasticsearch_port }}"
-      message_matcher: "Type == 'ceilometer_resources'"
-      encoder: elasticsearch_resource_encoder
-{%- endif %}
diff --git a/heka/metric_collector.sls b/heka/metric_collector.sls
deleted file mode 100644
index 7b28a7c..0000000
--- a/heka/metric_collector.sls
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- if pillar.heka.metric_collector is defined %}
-
-include:
-- heka._common
-
-{%- from "heka/map.jinja" import metric_collector with context %}
-{%- set server = metric_collector %}
-{%- set service_name = "metric_collector" %}
-
-{%- include "heka/_service.sls" %}
-
-{%- endif %}
diff --git a/heka/remote_collector.sls b/heka/remote_collector.sls
deleted file mode 100644
index 35533c3..0000000
--- a/heka/remote_collector.sls
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- if pillar.heka.remote_collector is defined %}
-
-include:
-- heka._common
-
-{%- from "heka/map.jinja" import remote_collector with context %}
-{%- set server = remote_collector %}
-{%- set service_name = "remote_collector" %}
-
-{%- include "heka/_service.sls" %}
-
-{%- endif %}
diff --git a/heka/server.sls b/heka/server.sls
index c2de1a0..c26c967 100644
--- a/heka/server.sls
+++ b/heka/server.sls
@@ -198,4 +198,4 @@
 {%- endif %}
 {%- endfor %}
 
-{%- endif %}
\ No newline at end of file
+{%- endif %}
diff --git a/metadata/service/aggregator/cluster.yml b/metadata/service/aggregator/cluster.yml
deleted file mode 100644
index e95243e..0000000
--- a/metadata/service/aggregator/cluster.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  _param:
-    aggregator_poolsize: 100
-  heka:
-    aggregator:
-      automatic_starting: false
-      enabled: true
-      influxdb_time_precision: ms
-      poolsize: ${_param:aggregator_poolsize}
diff --git a/metadata/service/aggregator/single.yml b/metadata/service/aggregator/single.yml
deleted file mode 100644
index 159e5bd..0000000
--- a/metadata/service/aggregator/single.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  _param:
-    aggregator_poolsize: 100
-    nagios_host_dimension_key: nagios_host
-  heka:
-    aggregator:
-      automatic_starting: true
-      enabled: true
-      influxdb_time_precision: ms
-      poolsize: ${_param:aggregator_poolsize}
-      nagios_host_dimension_key: ${_param:nagios_host_dimension_key}
diff --git a/metadata/service/ceilometer_collector/single.yml b/metadata/service/ceilometer_collector/single.yml
deleted file mode 100644
index bfc6e75..0000000
--- a/metadata/service/ceilometer_collector/single.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  heka:
-    ceilometer_collector:
-      enabled: true
diff --git a/metadata/service/log_collector/single.yml b/metadata/service/log_collector/single.yml
deleted file mode 100644
index 5160c35..0000000
--- a/metadata/service/log_collector/single.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  _param:
-    log_collector_poolsize: 100
-  heka:
-    log_collector:
-      enabled: true
-      poolsize: ${_param:log_collector_poolsize}
diff --git a/metadata/service/metric_collector/single.yml b/metadata/service/metric_collector/single.yml
deleted file mode 100644
index 2e4a442..0000000
--- a/metadata/service/metric_collector/single.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  _param:
-    metric_collector_poolsize: 100
-    nagios_host_dimension_key: nagios_host
-  heka:
-    metric_collector:
-      enabled: true
-      influxdb_time_precision: ms
-      poolsize: ${_param:metric_collector_poolsize}
-      nagios_host_dimension_key: ${_param:nagios_host_dimension_key}
diff --git a/metadata/service/remote_collector/cluster.yml b/metadata/service/remote_collector/cluster.yml
deleted file mode 100644
index 9e60e86..0000000
--- a/metadata/service/remote_collector/cluster.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  _param:
-    remote_collector_poolsize: 100
-  heka:
-    remote_collector:
-      automatic_starting: false
-      enabled: true
-      influxdb_time_precision: ms
-      poolsize: ${_param:remote_collector_poolsize}
diff --git a/metadata/service/remote_collector/single.yml b/metadata/service/remote_collector/single.yml
deleted file mode 100644
index 8533ad2..0000000
--- a/metadata/service/remote_collector/single.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-applications:
-- heka
-classes:
-- service.heka.support
-parameters:
-  _param:
-    remote_collector_poolsize: 100
-  heka:
-    remote_collector:
-      automatic_starting: true
-      enabled: true
-      influxdb_time_precision: ms
-      poolsize: ${_param:remote_collector_poolsize}
diff --git a/metadata/service/support.yml b/metadata/service/support.yml
index 8af2cd5..8041310 100644
--- a/metadata/service/support.yml
+++ b/metadata/service/support.yml
@@ -2,9 +2,9 @@
   heka:
     _support:
       collectd:
-        enabled: true
+        enabled: false
       heka:
-        enabled: true
+        enabled: false
       sensu:
         enabled: false
       sphinx:
diff --git a/tests/lua/mocks/extra_fields.lua b/tests/lua/mocks/extra_fields.lua
deleted file mode 100644
index 1bba814..0000000
--- a/tests/lua/mocks/extra_fields.lua
+++ /dev/null
@@ -1,23 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-local M = {}
-setfenv(1, M) -- Remove external access to contain everything in the module
-
-environment_id = 42
-
-tags = {
-    environment_id=environment_id
-}
-
-return M
diff --git a/tests/lua/test_accumulator.lua b/tests/lua/test_accumulator.lua
deleted file mode 100644
index 837ffd5..0000000
--- a/tests/lua/test_accumulator.lua
+++ /dev/null
@@ -1,68 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-require('os')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-local accumulator = require('accumulator')
-
-TestAccumulator = {}
-
-    function TestAccumulator:test_flush_on_append()
-        local sentinel = false
-        local function test_cb(items)
-            assertEquals(#items, 3)
-            sentinel = true
-        end
-        local accum = accumulator.new(2, 5, test_cb)
-        accum:append(1)
-        assertEquals(sentinel, false)
-        accum:append(2)
-        assertEquals(sentinel, false)
-        accum:append(3)
-        assertEquals(sentinel, true)
-    end
-
-    function TestAccumulator:test_flush_interval_with_buffer()
-        local now = os.time()
-        local sentinel = false
-        local function test_cb(items)
-            assertEquals(#items, 1)
-            sentinel = true
-        end
-        local accum = accumulator.new(20, 1, test_cb)
-        accum:append(1)
-        assertEquals(sentinel, false)
-        accum:flush((now + 2) * 1e9)
-        assertEquals(sentinel, true)
-    end
-
-    function TestAccumulator:test_flush_interval_with_empty_buffer()
-        local now = os.time()
-        local sentinel = false
-        local function test_cb(items)
-            assertEquals(#items, 0)
-            sentinel = true
-        end
-        local accum = accumulator.new(20, 1, test_cb)
-        accum:flush((now + 2) * 1e9)
-        assertEquals(sentinel, true)
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
-
diff --git a/tests/lua/test_afd.lua b/tests/lua/test_afd.lua
deleted file mode 100644
index a54bdfd..0000000
--- a/tests/lua/test_afd.lua
+++ /dev/null
@@ -1,155 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
--- mock the inject_message() function from the Heka sandbox library
-local last_injected_msg
-function inject_message(msg)
-    last_injected_msg = msg
-end
-
-local afd = require('afd')
-local consts = require('gse_constants')
-local extra = require('extra_fields')
-
-TestAfd = {}
-
-    function TestAfd:setUp()
-        afd.reset_alarms()
-    end
-
-    function TestAfd:test_add_to_alarms()
-        afd.add_to_alarms(consts.CRIT, 'last', 'metric_1', {}, {}, '==', 0, 0, nil, nil, "crit message")
-        local alarms = afd.get_alarms()
-        assertEquals(alarms[1].severity, 'CRITICAL')
-        assertEquals(alarms[1].metric, 'metric_1')
-        assertEquals(alarms[1].message, 'crit message')
-
-        afd.add_to_alarms(consts.WARN, 'last', 'metric_2', {}, {}, '>=', 10, 2, 5, 600, "warn message")
-        alarms = afd.get_alarms()
-        assertEquals(alarms[2].severity, 'WARN')
-        assertEquals(alarms[2].metric, 'metric_2')
-        assertEquals(alarms[2].message, 'warn message')
-    end
-
-    function TestAfd:test_inject_afd_metric_without_alarms()
-        afd.inject_afd_metric(consts.OKAY, 'node-1', 'foo', {}, false)
-
-        local alarms = afd.get_alarms()
-        assertEquals(#alarms, 0)
-        assertEquals(last_injected_msg.Type, 'afd_metric')
-        assertEquals(last_injected_msg.Fields.value, consts.OKAY)
-        assertEquals(last_injected_msg.Fields.hostname, 'node-1')
-        assertEquals(last_injected_msg.Payload, '{"alarms":[]}')
-    end
-
-    function TestAfd:test_inject_afd_metric_with_alarms()
-        afd.add_to_alarms(consts.CRIT, 'last', 'metric_1', {}, {}, '==', 0, 0, nil, nil, "important message")
-        afd.inject_afd_metric(consts.CRIT, 'node-1', 'foo', {}, false)
-
-        local alarms = afd.get_alarms()
-        assertEquals(#alarms, 0)
-        assertEquals(last_injected_msg.Type, 'afd_metric')
-        assertEquals(last_injected_msg.Fields.value, consts.CRIT)
-        assertEquals(last_injected_msg.Fields.hostname, 'node-1')
-        assertEquals(last_injected_msg.Fields.environment_id, extra.environment_id)
-        assert(last_injected_msg.Payload:match('"message":"important message"'))
-        assert(last_injected_msg.Payload:match('"severity":"CRITICAL"'))
-    end
-
-    function TestAfd:test_alarms_for_human_without_fields()
-        local alarms = afd.alarms_for_human({{
-            severity='WARNING',
-            ['function']='avg',
-            metric='load_longterm',
-            fields={},
-            tags={},
-            operator='>',
-            value=7,
-            threshold=5,
-            window=600,
-            periods=0,
-            message='load too high',
-        }})
-
-        assertEquals(#alarms, 1)
-        assertEquals(alarms[1], 'load too high (WARNING, rule=\'avg(load_longterm)>5\', current=7.00)')
-    end
-
-    function TestAfd:test_alarms_for_human_with_fields()
-        local alarms = afd.alarms_for_human({{
-            severity='CRITICAL',
-            ['function']='avg',
-            metric='fs_space_percent_free',
-            fields={fs='/'},
-            tags={},
-            operator='<=',
-            value=2,
-            threshold=5,
-            window=600,
-            periods=0,
-            message='free disk space too low'
-        }})
-
-        assertEquals(#alarms, 1)
-        assertEquals(alarms[1], 'free disk space too low (CRITICAL, rule=\'avg(fs_space_percent_free[fs="/"])<=5\', current=2.00)')
-    end
-
-    function TestAfd:test_alarms_for_human_with_hostname()
-        local alarms = afd.alarms_for_human({{
-            severity='WARNING',
-            ['function']='avg',
-            metric='load_longterm',
-            fields={},
-            tags={},
-            operator='>',
-            value=7,
-            threshold=5,
-            window=600,
-            periods=0,
-            message='load too high',
-            hostname='node-1'
-        }})
-
-        assertEquals(#alarms, 1)
-        assertEquals(alarms[1], 'load too high (WARNING, rule=\'avg(load_longterm)>5\', current=7.00, host=node-1)')
-    end
-
-    function TestAfd:test_alarms_for_human_with_hints()
-        local alarms = afd.alarms_for_human({{
-            severity='WARNING',
-            ['function']='avg',
-            metric='load_longterm',
-            fields={},
-            tags={dependency_level='hint',dependency_name='controller'},
-            operator='>',
-            value=7,
-            threshold=5,
-            window=600,
-            periods=0,
-            message='load too high',
-            hostname='node-1'
-        }})
-
-        assertEquals(#alarms, 2)
-        assertEquals(alarms[1], 'Other related alarms:')
-        assertEquals(alarms[2], 'load too high (WARNING, rule=\'avg(load_longterm)>5\', current=7.00, host=node-1)')
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_afd_alarm.lua b/tests/lua/test_afd_alarm.lua
deleted file mode 100644
index 35c877a..0000000
--- a/tests/lua/test_afd_alarm.lua
+++ /dev/null
@@ -1,1080 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-local lma_alarm = require('afd_alarms')
-local consts = require('gse_constants')
-
-local alarms = {
-    { -- 1
-        name = 'FS_all_no_field',
-        description = 'FS all no field',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'fs_space_percent_free',
-                    window = 120,
-                    ['function'] = 'avg',
-                    relational_operator = '<=',
-                    threshold = 11,
-                },
-            },
-            logical_operator = 'and',
-        },
-        severity = 'warning',
-    },
-    { -- 2
-        name = 'RabbitMQ_Critical',
-        description = 'Number of messages in queue is critical',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    relational_operator = '>=',
-                    metric = 'rabbitmq_messages',
-                    fields = {},
-                    window = "300",
-                    periods = "0",
-                    ['function'] = 'min',
-                    threshold = "50",
-                },
-            },
-            logical_operator = 'or',
-        },
-        severity = 'critical',
-    },
-    { -- 3
-        name = 'CPU_Critical_Controller',
-        description = 'CPU is critical for the controller',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'cpu_idle',
-                    window = 120,
-                    periods = 2,
-                    ['function'] = 'avg',
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-                {
-                    metric = 'cpu_wait',
-                    window = 120,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    relational_operator = '>=',
-                    threshold = 20,
-                },
-            },
-            logical_operator = 'or',
-        },
-        severity = 'critical',
-    },
-    { -- 4
-        name = 'CPU_Warning_Controller',
-        description = 'CPU is warning for controller',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'cpu_idle',
-                    window = 100,
-                    periods = 2,
-                    ['function'] = 'avg',
-                    relational_operator = '<=',
-                    threshold = 15,
-                },
-                {
-                    metric = 'cpu_wait',
-                    window = 60,
-                    periods = 0,
-                    ['function'] = 'avg',
-                    relational_operator = '>=',
-                    threshold = 25,
-                },
-            },
-            logical_operator = 'or',
-        },
-        severity = 'warning',
-    },
-    { -- 5
-        name = 'CPU_Critical_Controller_AND',
-        description = 'CPU is critical for controller',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'cpu_idle',
-                    window = 120,
-                    periods = 2,
-                    ['function'] = 'avg',
-                    relational_operator = '<=',
-                    threshold = 3,
-                },
-                {
-                    metric = 'cpu_wait',
-                    window = 60,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    relational_operator = '>=',
-                    threshold = 30,
-                },
-            },
-            logical_operator = 'and',
-        },
-        severity = 'critical',
-    },
-    { -- 6
-        name = 'FS_root',
-        description = 'FS root',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'fs_space_percent_free',
-                    window = 120,
-                    ['function'] = 'avg',
-                    fields = { fs='/'},
-                    relational_operator = '<=',
-                    threshold = 10,
-                },
-            },
-            logical_operator = 'and',
-        },
-        severity = 'critical',
-    },
-    { -- 7
-        name = 'Backend_errors_5xx',
-        description = 'Errors 5xx on backends',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'haproxy_backend_response_5xx',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'diff',
-                    relational_operator = '>',
-                    threshold = 0,
-                },
-            },
-            logical_operator = 'or',
-        },
-        severity = 'warning',
-    },
-    { -- 8
-        name = 'nova_logs_errors_rate',
-        description = 'Rate of change for nova logs in error is too high',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'log_messages',
-                    window = 60,
-                    periods = 4,
-                    ['function'] = 'roc',
-                    threshold = 1.5,
-                },
-            },
-        },
-        severity = 'warning',
-    },
-    { -- 9
-        name = 'heartbeat',
-        description = 'No metric!',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'foo_heartbeat',
-                    window = 60,
-                    periods = 1,
-                    ['function'] = 'last',
-                    relational_operator = '==',
-                    threshold = 0,
-                },
-            },
-        },
-        severity = 'down',
-    },
-}
-
-afd_on_multivalue = {
-    name = 'keystone-high-http-response-times',
-    description = 'The 90 percentile response time for Keystone is too high',
-    enabled = true,
-    trigger = {
-        rules = {
-            {
-                metric = 'http_response_times',
-                window = 60,
-                periods = 1,
-                ['function'] = 'max',
-                threshold = 5,
-                fields = { http_method = 'POST' },
-                relational_operator = '>=',
-                value = 'upper_90',
-            },
-        },
-    },
-    severity = 'warning',
-}
-
-missing_value_afd_on_multivalue = {
-    name = 'keystone-high-http-response-times',
-    description = 'The 90 percentile response time for Keystone is too high',
-    enabled = true,
-    trigger = {
-        rules = {
-            {
-                metric = 'http_response_times',
-                window = 30,
-                periods = 2,
-                ['function'] = 'max',
-                threshold = 5,
-                fields = { http_method = 'POST' },
-                relational_operator = '>=',
-                -- value = 'upper_90',
-            },
-        },
-    },
-    severity = 'warning',
-}
-
-TestLMAAlarm = {}
-
-local current_time = 0
-
-function TestLMAAlarm:tearDown()
-    lma_alarm.reset_alarms()
-    current_time = 0
-end
-
-local function next_time(inc)
-    if not inc then inc = 10 end
-    current_time = current_time + (inc*1e9)
-    return current_time
-end
-
-function TestLMAAlarm:test_start_evaluation()
-    lma_alarm.load_alarm(alarms[3]) -- window=120 period=2
-    lma_alarm.set_start_time(current_time)
-    local alarm = lma_alarm.get_alarm('CPU_Critical_Controller')
-    assertEquals(alarm:is_evaluation_time(next_time(10)), false) -- 10 seconds
-    assertEquals(alarm:is_evaluation_time(next_time(50)), false) -- 60 seconds
-    assertEquals(alarm:is_evaluation_time(next_time(60)), false) -- 120 seconds
-    assertEquals(alarm:is_evaluation_time(next_time(120)), true) -- 240 seconds
-    assertEquals(alarm:is_evaluation_time(next_time(240)), true) -- later
-end
-
-function TestLMAAlarm:test_not_the_time()
-    lma_alarm.load_alarms(alarms)
-    lma_alarm.set_start_time(current_time)
-    local state, _ = lma_alarm.evaluate(next_time()) -- no alarm w/ window <= 10s
-    assertEquals(state, nil)
-end
-
-function TestLMAAlarm:test_lookup_fields_for_metric()
-    lma_alarm.load_alarms(alarms)
-    local fields_required = lma_alarm.get_metric_fields('fs_space_percent_free')
-    assertItemsEquals(fields_required, {"fs"})
-end
-
-function TestLMAAlarm:test_lookup_empty_fields_for_metric()
-    lma_alarm.load_alarms(alarms)
-    local fields_required = lma_alarm.get_metric_fields('cpu_idle')
-    assertItemsEquals(fields_required, {})
-    local fields_required = lma_alarm.get_metric_fields('fs_space_percent_free')
-    assertItemsEquals(fields_required, {'fs'})
-end
-
-function TestLMAAlarm:test_lookup_interested_alarms()
-    lma_alarm.load_alarms(alarms)
-    local alarms = lma_alarm.get_interested_alarms('foometric')
-    assertEquals(#alarms, 0)
-    local alarms = lma_alarm.get_interested_alarms('cpu_wait')
-    assertEquals(#alarms, 3)
-
-end
-
-function TestLMAAlarm:test_get_alarms()
-    lma_alarm.load_alarms(alarms)
-    local all_alarms = lma_alarm.get_alarms()
-    local num = 0
-    for _, _ in pairs(all_alarms) do
-        num = num + 1
-    end
-    assertEquals(num, #alarms)
-end
-
-function TestLMAAlarm:test_no_datapoint()
-    lma_alarm.load_alarms(alarms)
-    lma_alarm.set_start_time(current_time)
-    local t = next_time(300) -- at this time all alarms can be evaluated
-    local state, results = lma_alarm.evaluate(t)
-    assertEquals(state, consts.UNKW)
-    assert(#results > 0)
-    for _, result in ipairs(results) do
-        assertEquals(result.alert.message, 'No datapoint have been received ever')
-        assertNotEquals(result.alert.fields, nil)
-    end
-end
-
-function TestLMAAlarm:test_rules_logical_op_and_no_alert()
-    lma_alarm.load_alarms(alarms)
-    local alarm = lma_alarm.get_alarm('CPU_Critical_Controller_AND')
-    lma_alarm.set_start_time(current_time)
-    local t1 = next_time(60) -- 60s
-    local t2 = next_time(60) -- 120s
-    local t3 = next_time(60) -- 180s
-    local t4 = next_time(60) -- 240s
-    lma_alarm.add_value(t1, 'cpu_wait', 3)
-    lma_alarm.add_value(t2, 'cpu_wait', 10)
-    lma_alarm.add_value(t3, 'cpu_wait', 1)
-    lma_alarm.add_value(t4, 'cpu_wait', 10)
-
-    lma_alarm.add_value(t1, 'cpu_idle', 30)
-    lma_alarm.add_value(t2, 'cpu_idle', 10)
-    lma_alarm.add_value(t3, 'cpu_idle', 10)
-    lma_alarm.add_value(t4, 'cpu_idle', 20)
-    local state, result = alarm:evaluate(t4)
-    assertEquals(#result, 0)
-    assertEquals(state, consts.OKAY)
-end
-
-function TestLMAAlarm:test_rules_logical_missing_datapoint__op_and()
-    lma_alarm.load_alarm(alarms[5])
-    lma_alarm.set_start_time(current_time)
-    local t1 = next_time(60)
-    local t2 = next_time(60)
-    local t3 = next_time(60)
-    local t4 = next_time(60)
-    lma_alarm.add_value(t1, 'cpu_wait', 0) -- 60s
-    lma_alarm.add_value(t2, 'cpu_wait', 2) -- 120s
-    lma_alarm.add_value(t3, 'cpu_wait', 5) -- 180s
-    lma_alarm.add_value(t4, 'cpu_wait', 6) -- 240s
-    lma_alarm.add_value(t1, 'cpu_idle', 20) -- 60s
-    lma_alarm.add_value(t2, 'cpu_idle', 20) -- 120s
-    lma_alarm.add_value(t3, 'cpu_idle', 20) -- 180s
-    lma_alarm.add_value(t4, 'cpu_idle', 20) -- 240s
-    local state, result = lma_alarm.evaluate(t4) -- 240s we can evaluate
-    assertEquals(state, consts.OKAY)
-    assertEquals(#result, 0)
-    local state, result = lma_alarm.evaluate(next_time(60)) -- 60s w/o datapoint
-    assertEquals(state, consts.OKAY)
-    --  cpu_wait have no data within its observation period
-    local state, result = lma_alarm.evaluate(next_time(1)) -- 61s w/o datapoint
-    assertEquals(state, consts.UNKW)
-    assertEquals(#result, 1)
-    assertEquals(result[1].alert.metric, 'cpu_wait')
-    assert(result[1].alert.message:match('No datapoint have been received over the last'))
-
-    --  both cpu_idle and cpu_wait have no data within their observation periods
-    local state, result = lma_alarm.evaluate(next_time(180)) -- 241s w/o datapoint
-    assertEquals(state, consts.UNKW)
-    assertEquals(#result, 2)
-    assertEquals(result[1].alert.metric, 'cpu_idle')
-    assert(result[1].alert.message:match('No datapoint have been received over the last'))
-    assertEquals(result[2].alert.metric, 'cpu_wait')
-    assert(result[2].alert.message:match('No datapoint have been received over the last'))
-
-    -- datapoints come back for both metrics
-    lma_alarm.add_value(next_time(), 'cpu_idle', 20)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 20)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 20)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 20)
-    local state, result = lma_alarm.evaluate(next_time()) -- 240s we can evaluate
-    assertEquals(state, consts.OKAY)
-    assertEquals(#result, 0)
-end
-
-function TestLMAAlarm:test_rules_logical_missing_datapoint__op_and_2()
-    lma_alarm.load_alarm(alarms[5])
-    lma_alarm.set_start_time(current_time)
-    local t1 = next_time(60)
-    local t2 = next_time(60)
-    local t3 = next_time(60)
-    local t4 = next_time(60)
-    lma_alarm.add_value(t1, 'cpu_wait', 0) -- 60s
-    lma_alarm.add_value(t2, 'cpu_wait', 2) -- 120s
-    lma_alarm.add_value(t3, 'cpu_wait', 5) -- 180s
-    lma_alarm.add_value(t4, 'cpu_wait', 6) -- 240s
-    lma_alarm.add_value(t1, 'cpu_idle', 20) -- 60s
-    lma_alarm.add_value(t2, 'cpu_idle', 20) -- 120s
-    lma_alarm.add_value(t3, 'cpu_idle', 20) -- 180s
-    lma_alarm.add_value(t4, 'cpu_idle', 20) -- 240s
-    local state, result = lma_alarm.evaluate(t4) -- 240s we can evaluate
-    assertEquals(state, consts.OKAY)
-    assertEquals(#result, 0)
-    local state, result = lma_alarm.evaluate(next_time(60)) -- 60s w/o datapoint
-    assertEquals(state, consts.OKAY)
-    --  cpu_wait have no data within its observation period
-    local state, result = lma_alarm.evaluate(next_time(1)) -- 61s w/o datapoint
-    assertEquals(state, consts.UNKW)
-    assertEquals(#result, 1)
-    assertEquals(result[1].alert.metric, 'cpu_wait')
-    assert(result[1].alert.message:match('No datapoint have been received over the last'))
-
-    lma_alarm.add_value(next_time(170), 'cpu_wait', 20)
-    --  cpu_idle have no data within its observation period
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.UNKW)
-    assertEquals(#result, 1)
-    assertEquals(result[1].alert.metric, 'cpu_idle')
-    assert(result[1].alert.message:match('No datapoint have been received over the last'))
-
-    -- datapoints come back for both metrics
-    lma_alarm.add_value(next_time(), 'cpu_idle', 20)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 20)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 20)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 20)
-    local state, result = lma_alarm.evaluate(next_time()) -- 240s we can evaluate
-    assertEquals(state, consts.OKAY)
-    assertEquals(#result, 0)
-end
-
-function TestLMAAlarm:test_rules_logical_op_and()
-    lma_alarm.load_alarm(alarms[5])
-    local cpu_critical_and = lma_alarm.get_alarm('CPU_Critical_Controller_AND')
-    lma_alarm.add_value(next_time(1), 'cpu_wait', 30)
-    lma_alarm.add_value(next_time(1), 'cpu_wait', 30)
-    lma_alarm.add_value(next_time(1), 'cpu_wait', 35)
-
-    lma_alarm.add_value(next_time(2), 'cpu_idle', 0)
-    lma_alarm.add_value(next_time(2), 'cpu_idle', 1)
-    lma_alarm.add_value(next_time(2), 'cpu_idle', 7)
-    lma_alarm.add_value(next_time(2), 'cpu_idle', 2)
-    local state, result = cpu_critical_and:evaluate(current_time)
-    assertEquals(state, consts.CRIT)
-    assertEquals(#result, 2) -- both rules match: avg(cpu_wait)>=30 and avg(cpu_idle)<=15
-
-    lma_alarm.add_value(next_time(120), 'cpu_idle', 70)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 70)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 70)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 40)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 38)
-    local state, result = cpu_critical_and:evaluate(current_time)
-    assertEquals(state, consts.OKAY)
-    assertEquals(#result, 0) -- avg(cpu_wait)>=30 matches but not avg(cpu_idle)<=15
-
-    lma_alarm.add_value(next_time(200), 'cpu_idle', 70)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 70)
-    local state, result = cpu_critical_and:evaluate(current_time)
-    assertEquals(state, consts.UNKW)
-    assertEquals(#result, 1) -- no data for avg(cpu_wait)>=30 and avg(cpu_idle)<=3 doesn't match
-
-    next_time(240) -- spend enough time to invalidate datapoints of cpu_wait
-    lma_alarm.add_value(current_time, 'cpu_idle', 2)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 2)
-    local state, result = cpu_critical_and:evaluate(current_time)
-    assertEquals(state, consts.UNKW)
-    assertEquals(#result, 2) -- no data for avg(cpu_wait)>=30 and avg(cpu_idle)<=3 matches
-end
-
-function TestLMAAlarm:test_rules_logical_op_or_one_alert()
-    lma_alarm.load_alarms(alarms)
-    local cpu_warn_and = lma_alarm.get_alarm('CPU_Warning_Controller')
-    lma_alarm.add_value(next_time(), 'cpu_wait', 15)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 10)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 20)
-
-    lma_alarm.add_value(next_time(), 'cpu_idle', 11)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 8)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 7)
-    local state, result = cpu_warn_and:evaluate(current_time)
-    assertEquals(state, consts.WARN)
-    assertEquals(#result, 1) -- avg(cpu_wait) IS NOT >=25 and avg(cpu_idle)<=2
-end
-
-function TestLMAAlarm:test_rules_logical_op_or_all_alert()
-    lma_alarm.load_alarm(alarms[4])
-    local cpu_warn_and = lma_alarm.get_alarm('CPU_Warning_Controller')
-    lma_alarm.add_value(next_time(), 'cpu_wait', 35)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 20)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 32)
-
-    lma_alarm.add_value(next_time(), 'cpu_idle', 3)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 2.5)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 1.5)
-    local state, result = cpu_warn_and:evaluate(current_time)
-    assertEquals(state, consts.WARN)
-    assertEquals(#result, 2) -- avg(cpu_wait) >=25 and avg(cpu_idle)<=3
-end
-
-function TestLMAAlarm:test_min()
-    lma_alarm.load_alarms(alarms)
-    lma_alarm.add_value(next_time(), 'rabbitmq_messages', 50)
-    lma_alarm.add_value(next_time(), 'rabbitmq_messages', 100)
-    lma_alarm.add_value(next_time(), 'rabbitmq_messages', 75)
-    lma_alarm.add_value(next_time(), 'rabbitmq_messages', 81)
-    local rabbitmq_critical = lma_alarm.get_alarm('RabbitMQ_Critical')
-    assertEquals(rabbitmq_critical.severity, consts.CRIT)
-    local state_crit, result = rabbitmq_critical:evaluate(current_time)
-    assertEquals(state_crit, consts.CRIT) -- min()>=50
-    assertEquals(#result, 1)
-    assertEquals(result[1].value, 50)
-end
-
- function TestLMAAlarm:test_max()
-    local a = {
-        name = 'foo alert',
-        description = 'foo description',
-        trigger = {
-            rules = {
-                {
-                    metric = 'rabbitmq_queue_messages',
-                    window = 30,
-                    periods = 2,
-                    ['function'] = 'max',
-                    threshold = 200,
-                    relational_operator = '>=',
-                },
-            },
-        },
-        severity = 'warning',
-    }
-     lma_alarm.load_alarm(a)
-     lma_alarm.add_value(next_time(), 'rabbitmq_queue_messages', 0, {queue = 'queue-XX', hostname = 'node-x'})
-     lma_alarm.add_value(next_time(), 'rabbitmq_queue_messages', 260, {queue = 'queue-XX', hostname = 'node-x'})
-     lma_alarm.add_value(next_time(), 'rabbitmq_queue_messages', 200, {queue = 'queue-XX', hostname = 'node-x'})
-     lma_alarm.add_value(next_time(), 'rabbitmq_queue_messages', 152, {queue = 'queue-XX', hostname = 'node-x'})
-     lma_alarm.add_value(next_time(), 'rabbitmq_queue_messages', 152, {queue = 'nova', hostname = 'node-x'})
-     lma_alarm.add_value(next_time(), 'rabbitmq_queue_messages', 532, {queue = 'nova', hostname = 'node-x'})
-     local state_warn, result = lma_alarm.evaluate(current_time)
-     assertEquals(state_warn, consts.WARN)
-     assertEquals(#result, 1)
-     assertEquals(result[1].alert['function'], 'max')
-     assertEquals(result[1].alert.value, 532)
- end
-
-function TestLMAAlarm:test_diff()
-    lma_alarm.load_alarms(alarms)
-    local errors_5xx = lma_alarm.get_alarm('Backend_errors_5xx')
-    assertEquals(errors_5xx.severity, consts.WARN)
-
-    -- with 5xx errors
-    lma_alarm.add_value(next_time(), 'haproxy_backend_response_5xx', 1)
-    lma_alarm.add_value(next_time(), 'haproxy_backend_response_5xx', 11) -- +10s
-    lma_alarm.add_value(next_time(), 'haproxy_backend_response_5xx', 21) -- +10s
-    local state, result = errors_5xx:evaluate(current_time)
-    assertEquals(state, consts.WARN)
-    assertEquals(#result, 1)
-    assertEquals(result[1].value, 20)
-
-    -- without 5xx errors
-    lma_alarm.add_value(next_time(), 'haproxy_backend_response_5xx', 21)
-    lma_alarm.add_value(next_time(), 'haproxy_backend_response_5xx', 21) -- +10s
-    lma_alarm.add_value(next_time(), 'haproxy_backend_response_5xx', 21) -- +10s
-    local state, result = errors_5xx:evaluate(current_time)
-    assertEquals(state, consts.OKAY)
-    assertEquals(#result, 0)
-
-    -- missing data
-    local state, result = errors_5xx:evaluate(next_time(60))
-    assertEquals(state, consts.UNKW)
-end
-
-function TestLMAAlarm:test_roc()
-    lma_alarm.load_alarms(alarms)
-    local errors_logs = lma_alarm.get_alarm('nova_logs_errors_rate')
-    assertEquals(errors_logs.severity, consts.WARN)
-    local m_values = {}
-
-    -- Test one error in the current window
-    m_values = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 0
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 0
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 3
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 4
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- previous window
-                 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } -- current window
-    for _,v in pairs(m_values) do
-        lma_alarm.add_value(next_time(5), 'log_messages', v, {service = 'nova', level = 'error'})
-    end
-    local state, _ = errors_logs:evaluate(current_time)
-    assertEquals(state, consts.WARN)
-
-    -- Test one error in the historical window
-    m_values = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 0
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 0
-                 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,  -- historical window 3
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- historical window 4
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  -- previous window
-                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -- current window
-    for _,v in pairs(m_values) do
-        lma_alarm.add_value(next_time(5), 'log_messages', v, {service = 'nova', level = 'error'})
-    end
-    local state, _ = errors_logs:evaluate(current_time)
-    assertEquals(state, consts.OKAY)
-
-    -- with rate errors
-    m_values = { 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 1
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 2
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 3
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 4
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- previous window
-                 1, 2, 1, 1, 1, 2, 1, 5, 5, 7, 1, 7 } -- current window
-    for _,v in pairs(m_values) do
-        lma_alarm.add_value(next_time(5), 'log_messages', v, {service = 'nova', level = 'error'})
-    end
-    local state, _ = errors_logs:evaluate(current_time)
-    assertEquals(state, consts.WARN)
-
-    -- without rate errors
-    m_values = { 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 1
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 2
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 3
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- historical window 4
-                 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2,  -- previous window
-                 1, 2, 1, 1, 1, 2, 1, 3, 4, 3, 3, 4 } -- current window
-    for _,v in pairs(m_values) do
-        lma_alarm.add_value(next_time(5), 'log_messages', v, {service = 'nova', level = 'error'})
-    end
-    local state, _ = errors_logs:evaluate(current_time)
-    assertEquals(state, consts.OKAY)
-end
-
-function TestLMAAlarm:test_alarm_first_match()
-    lma_alarm.load_alarm(alarms[3]) --  cpu critical (window 240s)
-    lma_alarm.load_alarm(alarms[4]) --  cpu warning (window 120s)
-    lma_alarm.set_start_time(current_time)
-
-    next_time(240) -- both alarms can now be evaluated
-    lma_alarm.add_value(next_time(), 'cpu_idle', 15)
-    lma_alarm.add_value(next_time(), 'cpu_wait', 9)
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.WARN) -- 2nd alarm raised
-    assertEquals(#result, 1) -- cpu_idle match (<= 15) and cpu_wait don't match (>= 25)
-
-    next_time(240) -- both alarms can now be evaluated with new datapoints
-    lma_alarm.add_value(next_time(), 'cpu_wait', 15)
-    lma_alarm.add_value(next_time(), 'cpu_idle', 4)
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.CRIT) -- first alarm raised
-    assertEquals(#result, 1) -- cpu_idle match (<= 5) and cpu_wait don't match (>= 20)
-end
-
-function TestLMAAlarm:test_rules_fields()
-    lma_alarm.load_alarm(alarms[1]) -- FS_all_no_field
-    lma_alarm.load_alarm(alarms[6]) -- FS_root
-    lma_alarm.set_start_time(current_time)
-
-    local t = next_time()
-    lma_alarm.add_value(t, 'fs_space_percent_free', 6, {fs = '/'})
-    lma_alarm.add_value(t, 'fs_space_percent_free', 6 )
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 12, {fs = '/'})
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 17 )
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 6, {fs = '/'})
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 6, {fs = 'foo'})
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 3, {fs = 'foo'})
-    local t = next_time()
-
-    local root_fs = lma_alarm.get_alarm('FS_root')
-    local state, result = root_fs:evaluate(t)
-    assertEquals(#result, 1)
-    assertItemsEquals(result[1].fields, {fs='/'})
-    assertEquals(result[1].value, 8)
-
-
-    local root_fs = lma_alarm.get_alarm('FS_all_no_field')
-    local state, result = root_fs:evaluate(t)
-    assertEquals(#result, 1)
-
-    assertItemsEquals(result[1].fields, {})
-    assertEquals(result[1].value, 8)
-end
-
-function TestLMAAlarm:test_last_fct()
-    lma_alarm.load_alarm(alarms[9])
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 1)
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 1)
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 0)
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 1)
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 0)
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.DOWN)
-    next_time(61)
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.UNKW)
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 0)
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.DOWN)
-    lma_alarm.add_value(next_time(), 'foo_heartbeat', 1)
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, consts.OKAY)
-end
-
-function TestLMAAlarm:test_rule_with_multivalue()
-    lma_alarm.load_alarm(afd_on_multivalue)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.4, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.2, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 6, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 3, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 4, foo = 1}, {http_method = 'POST'})
-    local state, result = lma_alarm.evaluate(next_time()) -- window 60 second
-    assertEquals(state, consts.WARN)
-    assertItemsEquals(result[1].alert.fields, {http_method='POST'})
-    assertEquals(result[1].alert.value, 6)
-end
-
-function TestLMAAlarm:test_nocrash_missing_value_with_multivalue_metric()
-    lma_alarm.load_alarm(missing_value_afd_on_multivalue)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.4, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.2, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 6, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 3, foo = 1}, {http_method = 'POST'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 4, foo = 1}, {http_method = 'POST'})
-    local state, result = lma_alarm.evaluate(next_time()) -- window 60 second
-    assertEquals(state, consts.UNKW)
-end
-
-function TestLMAAlarm:test_complex_field_matching_alarm_trigger()
-    local alert = {
-        name = 'keystone-high-http-response-times',
-        description = 'The 90 percentile response time for Keystone is too high',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'http_response_times',
-                    window = 30,
-                    periods = 2,
-                    ['function'] = 'max',
-                    threshold = 5,
-                    fields = { http_method = 'POST || GET',
-                               http_status = '2xx || ==3xx'},
-                    relational_operator = '>=',
-                    value = 'upper_90',
-                },
-            },
-        },
-        severity = 'warning',
-    }
-    lma_alarm.load_alarm(alert)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.4, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.2, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 6, foo = 1}, {http_method = 'POST', http_status = '3xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 999, foo = 1}, {http_method = 'POST', http_status = '5xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 3, foo = 1}, {http_method = 'GET', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 4, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    local state, result = lma_alarm.evaluate(next_time()) -- window 60 second
-    assertEquals(state, consts.WARN)
-    assertEquals(result[1].alert.value, 6) -- the max
-    assertItemsEquals(result[1].alert.fields, {http_method='POST || GET', http_status='2xx || ==3xx'})
-end
-
-function TestLMAAlarm:test_complex_field_matching_alarm_ok()
-    local alert = {
-        name = 'keystone-high-http-response-times',
-        description = 'The 90 percentile response time for Keystone is too high',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'http_response_times',
-                    window = 30,
-                    periods = 2,
-                    ['function'] = 'avg',
-                    threshold = 5,
-                    fields = { http_method = 'POST || GET',
-                               http_status = '2xx || 3xx'},
-                    relational_operator = '>=',
-                    value = 'upper_90',
-                },
-            },
-        },
-        severity = 'warning',
-    }
-
-    lma_alarm.load_alarm(alert)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.4, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 0.2, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 6, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 3, foo = 1}, {http_method = 'GET', http_status = '2xx'})
-    lma_alarm.add_value(next_time(), 'http_response_times', {upper_90 = 4, foo = 1}, {http_method = 'POST', http_status = '2xx'})
-    local state, result = lma_alarm.evaluate(next_time()) -- window 60 second
-    assertEquals(state, consts.OKAY)
-end
-
-function TestLMAAlarm:test_group_by_required_field()
-    local alert = {
-        name = 'foo-alarm',
-        description = 'foo description',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'foo_metric_name',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    fields = { foo = 'bar', bar = 'foo' },
-                    group_by = {'fs'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'warning',
-    }
-    lma_alarm.load_alarm(alert)
-    local fields = lma_alarm.get_metric_fields('foo_metric_name')
-    assertItemsEquals(fields, { "fs", "foo", "bar" })
-
-    local fields = lma_alarm.get_metric_fields('non_existant_metric')
-    assertItemsEquals(fields, {})
-end
-
-function TestLMAAlarm:test_group_by_one_field()
-    local alert = {
-        name = 'osd-filesystem-warning',
-        description = 'free space is too low',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'fs_space_percent_free',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    fields = { fs = '=~ osd%-%d && !~ /var/log' },
-                    group_by = {'fs'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'warning',
-    }
-    lma_alarm.load_alarm(alert)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 5, {fs = 'osd-1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 4, {fs = 'osd-2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 80, {fs = 'osd-3'})
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 4, {fs = 'osd-1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 3, {fs = 'osd-2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 80, {fs = 'osd-3'})
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 4, {fs = 'osd-1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 2, {fs = 'osd-2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 80, {fs = 'osd-3'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 1, {fs = '/var/log/osd-3'})
-
-    local state, result = lma_alarm.evaluate(next_time()) -- window 60 second
-    assertEquals(#result, 2)
-    assertEquals(state, consts.WARN)
-
-    next_time(100) -- spend enough time to invalidate datapoints
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 50, {fs = 'osd-1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 50, {fs = 'osd-2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 50, {fs = 'osd-3'})
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 50, {fs = 'osd-1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 50, {fs = 'osd-2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 50, {fs = 'osd-3'})
-    local state, result = lma_alarm.evaluate(next_time()) -- window 60 second
-    assertEquals(#result, 0)
-    assertEquals(state, consts.OKAY)
-end
-
-function TestLMAAlarm:test_group_by_several_fields()
-    local alert = {
-        name = 'osd-filesystem-warning',
-        description = 'free space is too low',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'fs_space_percent_free',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'last',
-                    fields = {},
-                    group_by = {'fs', 'osd'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'warning',
-    }
-    lma_alarm.load_alarm(alert)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 5, {fs = '/foo', osd = '1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 4, {fs = '/foo', osd = '2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 80, {fs = '/foo', osd = '3'})
-
-    local state, result = lma_alarm.evaluate(next_time(20))
-    assertEquals(state, consts.WARN)
-    -- one item for {fs = '/foo', osd = '1'} and another one for {fs = '/foo', osd = '2'}
-    assertEquals(#result, 2)
-
-    next_time(100) -- spend enough time to invalidate datapoints
-
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 5, {fs = '/foo', osd = '1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 4, {fs = '/foo', osd = '2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 80, {fs = '/foo', osd = '3'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 15, {fs = '/bar', osd = '1'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 14, {fs = '/bar', osd = '2'})
-    lma_alarm.add_value(current_time, 'fs_space_percent_free', 2, {fs = '/bar', osd = '3'})
-    local state, result = lma_alarm.evaluate(next_time(20))
-    assertEquals(state, consts.WARN)
-    -- one item for {fs = '/foo', osd = '1'}, another one for {fs = '/foo', osd = '2'}
-    -- and another one for {fs = '/bar', osd = '3'}
-    assertEquals(#result, 3)
-end
-
-function TestLMAAlarm:test_group_by_missing_field_is_unknown()
-    local alert = {
-        name = 'osd-filesystem-warning',
-        description = 'free space is too low',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'fs_space_percent_free',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    fields = { fs = '=~ osd%-%d && !~ /var/log' },
-                    group_by = {'fs'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'warning',
-    }
-    lma_alarm.load_alarm(alert)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 5)
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 4)
-    lma_alarm.add_value(next_time(), 'fs_space_percent_free', 4)
-
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(#result, 1)
-    assertEquals(state, consts.UNKW)
-end
-
-function TestLMAAlarm:test_no_data_policy_okay()
-    local alarm = {
-        name = 'foo-alarm',
-        description = 'foo description',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'foo_metric_name',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    fields = { foo = 'bar', bar = 'foo' },
-                    group_by = {'fs'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'warning',
-        no_data_policy = 'okay',
-    }
-    lma_alarm.load_alarm(alarm)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(100), 'another_metric', 5)
-
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(#result, 0)
-    assertEquals(state, consts.OKAY)
-end
-
-function TestLMAAlarm:test_no_data_policy_critical()
-    local alarm = {
-        name = 'foo-alarm',
-        description = 'foo description',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'foo_metric_name',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    fields = { foo = 'bar', bar = 'foo' },
-                    group_by = {'fs'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'critical',
-        no_data_policy = 'critical',
-    }
-    lma_alarm.load_alarm(alarm)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(100), 'another_metric', 5)
-
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(#result, 1)
-    assertEquals(state, consts.CRIT)
-end
-
-function TestLMAAlarm:test_no_data_policy_skip()
-    local alarm = {
-        name = 'foo-alarm',
-        description = 'foo description',
-        enabled = true,
-        trigger = {
-            rules = {
-                {
-                    metric = 'foo_metric_name',
-                    window = 30,
-                    periods = 1,
-                    ['function'] = 'avg',
-                    fields = { foo = 'bar', bar = 'foo' },
-                    group_by = {'fs'},
-                    relational_operator = '<=',
-                    threshold = 5,
-                },
-            },
-        },
-        severity = 'critical',
-        no_data_policy = 'skip',
-    }
-    lma_alarm.load_alarm(alarm)
-    lma_alarm.set_start_time(current_time)
-
-    lma_alarm.add_value(next_time(100), 'another_metric', 5)
-
-    local state, result = lma_alarm.evaluate(next_time())
-    assertEquals(state, nil)
-end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_gse.lua b/tests/lua/test_gse.lua
deleted file mode 100644
index be892f5..0000000
--- a/tests/lua/test_gse.lua
+++ /dev/null
@@ -1,230 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
--- mock the inject_message() function from the Heka sandbox library
-local last_injected_msg
-function inject_message(msg)
-    last_injected_msg = msg
-end
-
-local cjson = require('cjson')
-local consts = require('gse_constants')
-
-local gse = require('gse')
-local gse_policy = require('gse_policy')
-
-highest_policy = {
-    gse_policy.new({
-        status='down',
-        trigger={
-            logical_operator='or',
-            rules={{
-                ['function']='count',
-                arguments={'down'},
-                relational_operator='>',
-                threshold=0
-            }}
-        }
-    }),
-    gse_policy.new({
-        status='critical',
-        trigger={
-            logical_operator='or',
-            rules={{
-                ['function']='count',
-                arguments={'critical'},
-                relational_operator='>',
-                threshold=0
-            }}
-        }
-    }),
-    gse_policy.new({
-        status='warning',
-        trigger={
-            logical_operator='or',
-            rules={{
-                ['function']='count',
-                arguments={'warning'},
-                relational_operator='>',
-                threshold=0
-            }}
-        }
-    }),
-    gse_policy.new({status='okay'})
-}
-
--- define clusters
-gse.add_cluster("heat", {'heat-api', 'controller'}, {'nova', 'glance', 'neutron', 'keystone', 'rabbitmq'}, 'member', highest_policy)
-gse.add_cluster("nova", {'nova-api', 'nova-ec2-api', 'nova-scheduler'}, {'glance', 'neutron', 'keystone', 'rabbitmq'}, 'member', highest_policy)
-gse.add_cluster("neutron", {'neutron-api'}, {'keystone', 'rabbitmq'}, 'member', highest_policy)
-gse.add_cluster("keystone", {'keystone-admin-api', 'keystone-public-api'}, {}, 'member', highest_policy)
-gse.add_cluster("glance", {'glance-api', 'glance-registry-api'}, {'keystone'}, 'member', highest_policy)
-gse.add_cluster("rabbitmq", {'rabbitmq-cluster', 'controller'}, {}, 'hostname', highest_policy)
-
--- provision facts
-gse.set_member_status("neutron", "neutron-api", consts.DOWN, {{message="All neutron endpoints are down"}}, 'node-1')
-gse.set_member_status('keystone', 'keystone-admin-api', consts.OKAY, {}, 'node-1')
-gse.set_member_status('glance', "glance-api", consts.WARN, {{message="glance-api endpoint is down on node-1"}}, 'node-1')
-gse.set_member_status('glance', "glance-registry-api", consts.DOWN, {{message='glance-registry endpoints are down'}}, 'node-1')
-gse.set_member_status("rabbitmq", 'rabbitmq-cluster', consts.WARN, {{message="1 RabbitMQ node out of 3 is down"}}, 'node-2')
-gse.set_member_status("rabbitmq", 'rabbitmq-cluster', consts.OKAY, {}, 'node-1')
-gse.set_member_status("rabbitmq", 'rabbitmq-cluster', consts.OKAY, {}, 'node-3')
-gse.set_member_status('heat', "heat-api", consts.WARN, {{message='5xx errors detected'}}, 'node-1')
-gse.set_member_status('nova', "nova-api", consts.OKAY, {}, 'node-1')
-gse.set_member_status('nova', "nova-ec2_api", consts.OKAY, {}, 'node-1')
-gse.set_member_status('nova', "nova-scheduler", consts.OKAY, {}, 'node-1')
-gse.set_member_status('rabbitmq', "controller", consts.WARN, {{message='no space left'}}, 'node-1')
-gse.set_member_status('heat', "controller", consts.WARN, {{message='no space left'}}, 'node-1')
-
-for _, v in ipairs({'rabbitmq', 'keystone', 'glance', 'neutron', 'nova', 'heat'}) do
-    gse.resolve_status(v)
-end
-
-TestGse = {}
-
-    function TestGse:test_ordered_clusters()
-        local ordered_clusters = gse.get_ordered_clusters()
-        assertEquals(#ordered_clusters, 6)
-        assertEquals(ordered_clusters[1], 'rabbitmq')
-        assertEquals(ordered_clusters[2], 'keystone')
-        assertEquals(ordered_clusters[3], 'glance')
-        assertEquals(ordered_clusters[4], 'neutron')
-        assertEquals(ordered_clusters[5], 'nova')
-        assertEquals(ordered_clusters[6], 'heat')
-    end
-
-    function TestGse:test_01_rabbitmq_is_warning()
-        local status, alarms = gse.resolve_status('rabbitmq')
-        assertEquals(status, consts.WARN)
-        assertEquals(#alarms, 2)
-        assertEquals(alarms[1].hostname, 'node-1')
-        assertEquals(alarms[1].tags.dependency_name, 'controller')
-        assertEquals(alarms[1].tags.dependency_level, 'direct')
-        assertEquals(alarms[2].hostname, 'node-2')
-        assertEquals(alarms[2].tags.dependency_name, 'rabbitmq-cluster')
-        assertEquals(alarms[2].tags.dependency_level, 'direct')
-    end
-
-    function TestGse:test_02_keystone_is_okay()
-        local status, alarms = gse.resolve_status('keystone')
-        assertEquals(status, consts.OKAY)
-        assertEquals(#alarms, 0)
-    end
-
-    function TestGse:test_03_glance_is_down()
-        local status, alarms = gse.resolve_status('glance')
-        assertEquals(status, consts.DOWN)
-        assertEquals(#alarms, 2)
-        assert(alarms[1].hostname == nil)
-        assertEquals(alarms[1].tags.dependency_name, 'glance-api')
-        assertEquals(alarms[1].tags.dependency_level, 'direct')
-        assert(alarms[2].hostname == nil)
-        assertEquals(alarms[2].tags.dependency_name, 'glance-registry-api')
-        assertEquals(alarms[2].tags.dependency_level, 'direct')
-    end
-
-    function TestGse:test_04_neutron_is_down()
-        local status, alarms = gse.resolve_status('neutron')
-        assertEquals(status, consts.DOWN)
-        assertEquals(#alarms, 3)
-        assertEquals(alarms[1].tags.dependency_name, 'neutron-api')
-        assertEquals(alarms[1].tags.dependency_level, 'direct')
-        assert(alarms[1].hostname == nil)
-        assertEquals(alarms[2].tags.dependency_name, 'rabbitmq')
-        assertEquals(alarms[2].tags.dependency_level, 'hint')
-        assertEquals(alarms[2].hostname, 'node-1')
-        assertEquals(alarms[3].tags.dependency_name, 'rabbitmq')
-        assertEquals(alarms[3].tags.dependency_level, 'hint')
-        assertEquals(alarms[3].hostname, 'node-2')
-    end
-
-    function TestGse:test_05_nova_is_okay()
-        local status, alarms = gse.resolve_status('nova')
-        assertEquals(status, consts.OKAY)
-        assertEquals(#alarms, 0)
-    end
-
-    function TestGse:test_06_heat_is_warning_with_hints()
-        local status, alarms = gse.resolve_status('heat')
-        assertEquals(status, consts.WARN)
-        assertEquals(#alarms, 6)
-        assertEquals(alarms[1].tags.dependency_name, 'controller')
-        assertEquals(alarms[1].tags.dependency_level, 'direct')
-        assert(alarms[1].hostname == nil)
-        assertEquals(alarms[2].tags.dependency_name, 'heat-api')
-        assertEquals(alarms[2].tags.dependency_level, 'direct')
-        assert(alarms[2].hostname == nil)
-        assertEquals(alarms[3].tags.dependency_name, 'glance')
-        assertEquals(alarms[3].tags.dependency_level, 'hint')
-        assert(alarms[3].hostname == nil)
-        assertEquals(alarms[4].tags.dependency_name, 'glance')
-        assertEquals(alarms[4].tags.dependency_level, 'hint')
-        assert(alarms[4].hostname == nil)
-        assertEquals(alarms[5].tags.dependency_name, 'neutron')
-        assertEquals(alarms[5].tags.dependency_level, 'hint')
-        assert(alarms[5].hostname == nil)
-        assertEquals(alarms[6].tags.dependency_name, 'rabbitmq')
-        assertEquals(alarms[6].tags.dependency_level, 'hint')
-        assertEquals(alarms[6].hostname, 'node-2')
-    end
-
-    function TestGse:test_inject_cluster_metric_for_nova()
-        gse.inject_cluster_metric('nova', {key = "val"}, true)
-        local metric = last_injected_msg
-        assertEquals(metric.Type, 'gse_metric')
-        assertEquals(metric.Fields.member, 'nova')
-        assertEquals(metric.Fields.name, 'cluster_status')
-        assertEquals(metric.Fields.value, consts.OKAY)
-        assertEquals(metric.Fields.key, 'val')
-        assertEquals(metric.Payload, '{"alarms":[]}')
-    end
-
-    function TestGse:test_inject_cluster_metric_for_glance()
-        gse.inject_cluster_metric('glance', {key = "val"}, true)
-        local metric = last_injected_msg
-        assertEquals(metric.Type, 'gse_metric')
-        assertEquals(metric.Fields.member, 'glance')
-        assertEquals(metric.Fields.name, 'cluster_status')
-        assertEquals(metric.Fields.value, consts.DOWN)
-        assertEquals(metric.Fields.key, 'val')
-        assert(metric.Payload:match("glance%-registry endpoints are down"))
-        assert(metric.Payload:match("glance%-api endpoint is down on node%-1"))
-    end
-
-    function TestGse:test_inject_cluster_metric_for_heat()
-        gse.inject_cluster_metric('heat', {key = "val"}, true)
-        local metric = last_injected_msg
-        assertEquals(metric.Type, 'gse_metric')
-        assertEquals(metric.Fields.member, 'heat')
-        assertEquals(metric.Fields.name, 'cluster_status')
-        assertEquals(metric.Fields.value, consts.WARN)
-        assertEquals(metric.Fields.key, 'val')
-        assert(metric.Payload:match("5xx errors detected"))
-        assert(metric.Payload:match("1 RabbitMQ node out of 3 is down"))
-    end
-
-    function TestGse:test_reverse_index()
-        local clusters = gse.find_cluster_memberships('controller')
-        assertEquals(#clusters, 2)
-        assertEquals(clusters[1], 'heat')
-        assertEquals(clusters[2], 'rabbitmq')
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_gse_cluster_policy.lua b/tests/lua/test_gse_cluster_policy.lua
deleted file mode 100644
index a87d8cf..0000000
--- a/tests/lua/test_gse_cluster_policy.lua
+++ /dev/null
@@ -1,201 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-local gse_policy = require('gse_policy')
-local consts = require('gse_constants')
-
-local test_policy_down = gse_policy.new({
-    status='down',
-    trigger={
-        logical_operator='or',
-        rules={{
-            ['function']='count',
-            arguments={'down'},
-            relational_operator='>',
-            threshold=0
-        }}
-    }
-})
-
-local test_policy_critical = gse_policy.new({
-    status='critical',
-    trigger={
-        logical_operator='and',
-        rules={{
-            ['function']='count',
-            arguments={'critical'},
-            relational_operator='>',
-            threshold=0
-        }, {
-            ['function']='percent',
-            arguments={'okay', 'warning'},
-            relational_operator='<',
-            threshold=50
-        }}
-    }
-})
-
-local test_policy_warning = gse_policy.new({
-        status='warning',
-        trigger={
-            logical_operator='or',
-            rules={{
-                ['function']='percent',
-                arguments={'okay'},
-                relational_operator='<',
-                threshold=50
-            }, {
-                ['function']='percent',
-                arguments={'warning'},
-                relational_operator='>',
-                threshold=30
-            }}
-        }
-})
-
-local test_policy_okay = gse_policy.new({
-        status='okay'
-})
-
-TestGsePolicy = {}
-
-    function TestGsePolicy:test_policy_down()
-        assertEquals(test_policy_down.status, consts.DOWN)
-        assertEquals(test_policy_down.logical_op, 'or')
-        assertEquals(#test_policy_down.rules, 1)
-        assertEquals(test_policy_down.rules[1]['function'], 'count')
-        assertEquals(#test_policy_down.rules[1].arguments, 1)
-        assertEquals(test_policy_down.rules[1].arguments[1], consts.DOWN)
-        assertEquals(test_policy_down.rules[1].relational_op, '>')
-        assertEquals(test_policy_down.rules[1].threshold, 0)
-        assertEquals(test_policy_down.require_percent, false)
-    end
-
-    function TestGsePolicy:test_policy_okay_evaluate_true()
-        local facts = {
-            [consts.OKAY]=5,
-            [consts.WARN]=0,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_okay:evaluate(facts), true)
-    end
-
-    function TestGsePolicy:test_policy_okay_evaluate_true_again()
-        local facts = {
-            [consts.OKAY]=0,
-            [consts.WARN]=0,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_okay:evaluate(facts), true)
-    end
-
-    function TestGsePolicy:test_policy_warn_evaluate_true()
-        local facts = {
-            [consts.OKAY]=2,
-            [consts.WARN]=2,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=1,
-        }
-        assertEquals(test_policy_warning:evaluate(facts), true)
-    end
-
-    function TestGsePolicy:test_policy_warn_evaluate_false()
-        local facts = {
-            [consts.OKAY]=6,
-            [consts.WARN]=2,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=1,
-        }
-        assertEquals(test_policy_warning:evaluate(facts), false)
-    end
-
-    function TestGsePolicy:test_policy_warn_evaluate_true_again()
-        local facts = {
-            [consts.OKAY]=3,
-            [consts.WARN]=2,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_warning:evaluate(facts), true)
-    end
-
-    function TestGsePolicy:test_policy_crit_evaluate_true()
-        local facts = {
-            [consts.OKAY]=1,
-            [consts.WARN]=1,
-            [consts.CRIT]=3,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_critical:evaluate(facts), true)
-    end
-
-    function TestGsePolicy:test_policy_crit_evaluate_false()
-        local facts = {
-            [consts.OKAY]=4,
-            [consts.WARN]=1,
-            [consts.CRIT]=3,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_critical:evaluate(facts), false)
-    end
-
-    function TestGsePolicy:test_policy_crit_evaluate_false_again()
-        local facts = {
-            [consts.OKAY]=3,
-            [consts.WARN]=1,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_critical:evaluate(facts), false)
-    end
-
-    function TestGsePolicy:test_policy_down_evaluate_true()
-        local facts = {
-            [consts.OKAY]=2,
-            [consts.WARN]=2,
-            [consts.CRIT]=0,
-            [consts.DOWN]=1,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_down:evaluate(facts), true)
-    end
-
-    function TestGsePolicy:test_policy_down_evaluate_false()
-        local facts = {
-            [consts.OKAY]=2,
-            [consts.WARN]=3,
-            [consts.CRIT]=0,
-            [consts.DOWN]=0,
-            [consts.UNKW]=0,
-        }
-        assertEquals(test_policy_down:evaluate(facts), false)
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_gse_utils.lua b/tests/lua/test_gse_utils.lua
deleted file mode 100644
index c9cbcba..0000000
--- a/tests/lua/test_gse_utils.lua
+++ /dev/null
@@ -1,37 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-local gse_utils = require('gse_utils')
-local consts = require('gse_constants')
-
-TestGseUtils = {}
-
-    function TestGseUtils:test_max_status()
-        local status = gse_utils.max_status(consts.DOWN, consts.WARN)
-        assertEquals(consts.DOWN, status)
-        local status = gse_utils.max_status(consts.OKAY, consts.WARN)
-        assertEquals(consts.WARN, status)
-        local status = gse_utils.max_status(consts.OKAY, consts.DOWN)
-        assertEquals(consts.DOWN, status)
-        local status = gse_utils.max_status(consts.UNKW, consts.DOWN)
-        assertEquals(consts.DOWN, status)
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_influxdb.lua b/tests/lua/test_influxdb.lua
deleted file mode 100644
index 160c6b5..0000000
--- a/tests/lua/test_influxdb.lua
+++ /dev/null
@@ -1,52 +0,0 @@
--- Copyright 2016 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-require('os')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-local influxdb = require('influxdb')
-
-TestInfluxDB = {}
-
-    function TestInfluxDB:test_ms_precision_encoder()
-        local encoder = influxdb.new("ms")
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', 1), 'foo value=1.000000 1000000')
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', 'bar'), 'foo value="bar" 1000000')
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', 'b"ar'), 'foo value="b\\"ar" 1000000')
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', 1, {tag2="t2",tag1="t1"}), 'foo,tag1=t1,tag2=t2 value=1.000000 1000000')
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', {a=1, b=2}), 'foo a=1.000000,b=2.000000 1000000')
-    end
-
-    function TestInfluxDB:test_second_precision_encoder()
-        local encoder = influxdb.new("s")
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', 1), 'foo value=1.000000 1000')
-    end
-
-    function TestInfluxDB:test_us_precision_encoder()
-        local encoder = influxdb.new("us")
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, 'foo', 1), 'foo value=1.000000 1000000000')
-    end
-
-    function TestInfluxDB:test_encoder_with_bad_input()
-        local encoder = influxdb.new()
-        assertEquals(encoder:encode_datapoint(1e9 * 1000, nil, 1), '')
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
-
-
diff --git a/tests/lua/test_lma_utils.lua b/tests/lua/test_lma_utils.lua
deleted file mode 100644
index 8b6d198..0000000
--- a/tests/lua/test_lma_utils.lua
+++ /dev/null
@@ -1,96 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-function inject_message(msg)
-    if msg == 'fail' then
-        error('fail')
-    end
-end
-
-function inject_payload(payload_type, payload_name, data)
-    if data == 'fail' then
-        error('fail')
-    end
-end
-
-local lma_utils = require('lma_utils')
-
-TestLmaUtils = {}
-
-    function TestLmaUtils:test_safe_json_encode_with_valid_data()
-        local ret = lma_utils.safe_json_encode({})
-        assertEquals(ret, '{}')
-    end
-
-    function TestLmaUtils:test_safe_inject_message_without_error()
-        local ret, msg = lma_utils.safe_inject_message({})
-        assertEquals(ret, 0)
-        assertEquals(msg, nil)
-    end
-
-    function TestLmaUtils:test_safe_inject_message_with_error()
-        local ret, msg = lma_utils.safe_inject_message('fail')
-        assertEquals(ret, -1)
-        assert(msg:match(': fail'))
-    end
-
-    function TestLmaUtils:test_safe_inject_payload_without_error()
-        local ret, msg = lma_utils.safe_inject_payload('txt', 'foo', {})
-        assertEquals(ret, 0)
-        assertEquals(msg, nil)
-    end
-
-    function TestLmaUtils:test_safe_inject_payload_with_error()
-        local ret, msg = lma_utils.safe_inject_payload('txt', 'foo', 'fail')
-        assertEquals(ret, -1)
-        assert(msg:match(': fail'))
-    end
-
-    function TestLmaUtils:test_truncate_with_small_string()
-        local ret = lma_utils.truncate('foo', 10, '<BR/>')
-        assertEquals(ret, 'foo')
-    end
-
-    function TestLmaUtils:test_truncate_with_large_string()
-        local ret = lma_utils.truncate('foo and long string', 10, '<BR/>')
-        assertEquals(ret, 'foo and lo')
-    end
-
-    function TestLmaUtils:test_truncate_with_one_delimiter()
-        local ret = lma_utils.truncate('foo<BR/>longstring', 10, '<BR/>')
-        assertEquals(ret, 'foo')
-    end
-
-    function TestLmaUtils:test_truncate_with_several_delimiters_1()
-        local ret = lma_utils.truncate('foo<BR/>bar<BR/>longstring', 10, '<BR/>')
-        assertEquals(ret, 'foo')
-    end
-
-    function TestLmaUtils:test_truncate_with_several_delimiters_2()
-        local ret = lma_utils.truncate('foo<BR/>ba<BR/>longstring', 10, '<BR/>')
-        assertEquals(ret, 'foo<BR/>ba')
-    end
-
-    function TestLmaUtils:test_truncate_with_several_delimiters_3()
-        local ret = lma_utils.truncate('foo<BR/>ba<BR/>long<BR/>string', 12, '<BR/>')
-        assertEquals(ret, 'foo<BR/>ba')
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_patterns.lua b/tests/lua/test_patterns.lua
deleted file mode 100644
index 86d9507..0000000
--- a/tests/lua/test_patterns.lua
+++ /dev/null
@@ -1,122 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-require('os')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-local patt = require('patterns')
-local l = require('lpeg')
-
-TestPatterns = {}
-
-    function TestPatterns:test_Uuid()
-        assertEquals(patt.Uuid:match('be6876f2-c1e6-42ea-ad95-792a5500f0fa'),
-                                     'be6876f2-c1e6-42ea-ad95-792a5500f0fa')
-        assertEquals(patt.Uuid:match('be6876f2c1e642eaad95792a5500f0fa'),
-                                     'be6876f2-c1e6-42ea-ad95-792a5500f0fa')
-        assertEquals(patt.Uuid:match('ze6876f2c1e642eaad95792a5500f0fa'),
-                                     nil)
-        assertEquals(patt.Uuid:match('be6876f2-c1e642eaad95792a5500f0fa'),
-                                     nil)
-    end
-
-    function TestPatterns:test_Timestamp()
-        -- note that Timestamp:match() returns the number of nanosecs since the
-        -- Epoch in the local timezone
-        local_epoch = os.time(os.date("!*t",0)) * 1e9
-        assertEquals(patt.Timestamp:match('1970-01-01 00:00:01+00:00'),
-                                          local_epoch + 1e9)
-        assertEquals(patt.Timestamp:match('1970-01-01 00:00:02'),
-                                          local_epoch + 2e9)
-        assertEquals(patt.Timestamp:match('1970-01-01 00:00:03'),
-                                          local_epoch + 3e9)
-        assertEquals(patt.Timestamp:match('1970-01-01T00:00:04-00:00'),
-                                          local_epoch + 4e9)
-        assertEquals(patt.Timestamp:match('1970-01-01 01:00:05+01:00'),
-                                          local_epoch + 5e9)
-        assertEquals(patt.Timestamp:match('1970-01-01 00:00:00.123456+00:00'),
-                                          local_epoch + 0.123456 * 1e9)
-        assertEquals(patt.Timestamp:match('1970-01-01 00:01'),
-                                          nil)
-    end
-
-    function TestPatterns:test_programname()
-        assertEquals(l.C(patt.programname):match('nova-api'), 'nova-api')
-        assertEquals(l.C(patt.programname):match('nova-api foo'), 'nova-api')
-    end
-
-    function TestPatterns:test_anywhere()
-        assertEquals(patt.anywhere(l.C(patt.dash)):match(' - '), '-')
-        assertEquals(patt.anywhere(patt.dash):match(' . '), nil)
-    end
-
-    function TestPatterns:test_openstack()
-        local_epoch = os.time(os.date("!*t",0)) * 1e9
-        assertEquals(patt.openstack:match(
-            '1970-01-01 00:00:02 3434 INFO oslo_service.periodic_task [-] Blabla...'),
-            {Timestamp = local_epoch + 2e9, Pid = '3434', SeverityLabel = 'INFO',
-             PythonModule = 'oslo_service.periodic_task', Message = '[-] Blabla...'})
-    end
-
-    function TestPatterns:test_openstack_request_context()
-        assertEquals(patt.openstack_request_context:match('[-]'), nil)
-        assertEquals(patt.openstack_request_context:match(
-            "[req-4db318af-54c9-466d-b365-fe17fe4adeed - - - - -]"),
-            {RequestId = '4db318af-54c9-466d-b365-fe17fe4adeed'})
-        assertEquals(patt.openstack_request_context:match(
-            "[req-4db318af-54c9-466d-b365-fe17fe4adeed 8206d40abcc3452d8a9c1ea629b4a8d0 112245730b1f4858ab62e3673e1ee9e2 - - -]"),
-            {RequestId = '4db318af-54c9-466d-b365-fe17fe4adeed',
-             UserId = '8206d40a-bcc3-452d-8a9c-1ea629b4a8d0',
-             TenantId = '11224573-0b1f-4858-ab62-e3673e1ee9e2'})
-    end
-
-    function TestPatterns:test_openstack_http()
-        assertEquals(patt.openstack_http:match(
-            '"OPTIONS / HTTP/1.0" status: 200 len: 497 time: 0.0006731'),
-            {http_method = 'OPTIONS', http_url = '/', http_version = '1.0',
-             http_status = '200', http_response_size = 497,
-             http_response_time = 0.0006731})
-        assertEquals(patt.openstack_http:match(
-            'foo "OPTIONS / HTTP/1.0" status: 200 len: 497 time: 0.0006731 bar'),
-            {http_method = 'OPTIONS', http_url = '/', http_version = '1.0',
-             http_status = '200', http_response_size = 497,
-             http_response_time = 0.0006731})
-    end
-
-    function TestPatterns:test_openstack_http_with_extra_space()
-        assertEquals(patt.openstack_http:match(
-            '"OPTIONS / HTTP/1.0" status: 200  len: 497 time: 0.0006731'),
-            {http_method = 'OPTIONS', http_url = '/', http_version = '1.0',
-             http_status = '200', http_response_size = 497,
-             http_response_time = 0.0006731})
-        assertEquals(patt.openstack_http:match(
-            'foo "OPTIONS / HTTP/1.0" status: 200  len: 497 time: 0.0006731 bar'),
-            {http_method = 'OPTIONS', http_url = '/', http_version = '1.0',
-             http_status = '200', http_response_size = 497,
-             http_response_time = 0.0006731})
-    end
-
-    function TestPatterns:test_ip_address()
-        assertEquals(patt.ip_address:match('192.168.1.2'),
-            {ip_address = '192.168.1.2'})
-        assertEquals(patt.ip_address:match('foo 192.168.1.2 bar'),
-            {ip_address = '192.168.1.2'})
-        assertEquals(patt.ip_address:match('192.1688.1.2'), nil)
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_table_utils.lua b/tests/lua/test_table_utils.lua
deleted file mode 100644
index 88a7e90..0000000
--- a/tests/lua/test_table_utils.lua
+++ /dev/null
@@ -1,86 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-
-local table_utils = require('table_utils')
-
-TestTableUtils = {}
-
-    function TestTableUtils:setUp()
-        self.array = { 'a', 'b', 'c' }
-        self.dict = { c='C', a='A', b='B' }
-    end
-
-    function TestTableUtils:test_item_pos_with_match()
-        assertEquals(table_utils.item_pos('b', self.array), 2)
-    end
-
-    function TestTableUtils:test_item_pos_without_match()
-        assertEquals(table_utils.item_pos('z', self.array), nil)
-    end
-
-    function TestTableUtils:test_item_find_with_match()
-        assertEquals(table_utils.item_find('b', self.array), true)
-    end
-
-    function TestTableUtils:test_item_find_without_match()
-        assertEquals(table_utils.item_find('z', self.array), false)
-    end
-
-    function TestTableUtils:test_deep_copy()
-        local copy = table_utils.deepcopy(self.array)
-        assertEquals(#copy, #self.array)
-        assertEquals(copy[1], self.array[1])
-        assertEquals(copy[2], self.array[2])
-        assertEquals(copy[3], self.array[3])
-        assert(copy ~= self.array)
-    end
-
-    function TestTableUtils:test_orderedPairs()
-        local t = {}
-        for k,v in table_utils.orderedPairs(self.dict) do
-            t[#t+1] = { k=k, v=v }
-        end
-        assertEquals(#t, 3)
-        assertEquals(t[1].k, 'a')
-        assertEquals(t[1].v, 'A')
-        assertEquals(t[2].k, 'b')
-        assertEquals(t[2].v, 'B')
-        assertEquals(t[3].k, 'c')
-        assertEquals(t[3].v, 'C')
-    end
-
-    function TestTableUtils:test_table_equal_with_equal_keys_and_values()
-        assertTrue(table_utils.table_equal({a = 'a', b = 'b'}, {a = 'a', b = 'b'}))
-    end
-
-    function TestTableUtils:test_table_equal_with_nonequal_values()
-        assertFalse(table_utils.table_equal({a = 'a', b = 'b'}, {a = 'a', b = 'c'}))
-    end
-
-    function TestTableUtils:test_table_equal_with_nonequal_keys_1()
-        assertFalse(table_utils.table_equal({a = 'a', b = 'b'}, {a = 'a', c = 'b'}))
-    end
-
-    function TestTableUtils:test_table_equal_with_nonequal_keys_2()
-        assertFalse(table_utils.table_equal({a = 'a', b = 'b'},
-                                            {a = 'a', b = 'b', c = 'c'}))
-    end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/lua/test_value_matching.lua b/tests/lua/test_value_matching.lua
deleted file mode 100644
index 3142fb5..0000000
--- a/tests/lua/test_value_matching.lua
+++ /dev/null
@@ -1,229 +0,0 @@
--- Copyright 2015 Mirantis, Inc.
---
--- 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.
-
-EXPORT_ASSERT_TO_GLOBALS=true
-require('luaunit')
-package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
-local M = require('value_matching')
-
-TestValueMatching = {}
-
-function TestValueMatching:test_simple_matching()
-    local tests = {
-        {'/var/log',        '/var/log'},
-        {'== /var/log',     '/var/log'},
-        {'==/var/log',      '/var/log'},
-        {'==/var/log ',      '/var/log'},
-        {'==\t/var/log',    '/var/log'},
-        {'=="/var/log"',    '/var/log'},
-        {'== "/var/log"',   '/var/log'},
-        {'== " /var/log"',  ' /var/log'},
-        {'== "/var/log "',  '/var/log '},
-        {'== " /var/log "', ' /var/log '},
-        {8,                 8},
-        {8,                '8'},
-        {"9",               "9"},
-        {"==10",            " 10"},
-        {"10",              10},
-        {"== 10",           " 10"},
-        {"== 10.0",         " 10.0"},
-        {"== -10.01",       " -10.01"},
-        {"== 10 ",          " 10 "},
-        {' <=11',           '-11'},
-        {"!= -12",          42},
-        {"!= 12",           42},
-        {" > 13",            42},
-        {">= 13",           13},
-        {">= -13",           42},
-        {"< 14",            -0},
-        {"<= 14 ",           0},
-        {"<= 14",           "14"},
-    }
-    local r
-    for _, v in ipairs(tests) do
-        local exp, value = v[1], v[2]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertTrue(r)
-    end
-end
-
-function TestValueMatching:test_simple_not_matching()
-    local tests = {
-        {'/var/log',       '/var/log/mysql'},
-        {'== "/var/log"'   , '/var/log '},
-        {'"/var/log"',     '/var/log '},
-        {'"/var/log "',    '/var/log'},
-        {'nova-api',       'nova-compute'},
-        {'== /var/log',    '/var/log/mysql'},
-        {'==/var/log',     '/var/log/mysql'},
-        {'!=/var/log',     '/var/log'},
-        {'!= /var/log',    '/var/log'},
-        {'>10',            '5'},
-        {'> 10',           '5 '},
-        {' <11',           '11'},
-        {' >=11',          '-11'},
-        {' >=11 && <= 42', '-11'},
-        {' >=11 || == 42', '-11'},
-    }
-
-    for _, v in ipairs(tests) do
-        local exp, value = v[1], v[2]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertFalse(r)
-    end
-end
-
-function TestValueMatching:test_string_matching()
-    local tests = {
-        {'== "foo.bar"', "foo.bar", true},
-        {'== foo.bar', "foo.bar", true},
-        {'== foo.bar ', "foo.bar", true},
-        {'== foo || bar', "bar", true},
-        {'== foo || bar', "foo", true},
-        {'== foo || bar', "??", false},
-        {'!= foo || != bar', "42", true},
-    }
-
-    for _, v in ipairs(tests) do
-        local exp, value, expected = v[1], v[2], v[3]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertEquals(r, expected)
-    end
-
-end
-
-function TestValueMatching:test_invalid_expression()
-    local tests = {
-        '&& 1 && 1',
-        ' && 1',
-        '|| == 1',
-        '&& != 12',
-        ' ',
-        '   ',
-        '\t',
-        '',
-        nil,
-    }
-    for _, exp in ipairs(tests) do
-        assertError(M.new, exp)
-    end
-end
-
-function TestValueMatching:test_range_matching()
-    local tests = {
-        {'>= 200 && < 300', 200, true},
-        {'>=200&&<300'    , 200, true},
-        {' >=200&&<300'   , 200, true},
-        {'>= 200 && < 300', 204, true},
-        {'>= 200 && < 300', 300, false},
-        {'>= 200 && < 300', 42,  false},
-        {'>= 200 && < 300', 0,  false},
-    }
-
-    for _, v in ipairs(tests) do
-        local exp, value, expected = v[1], v[2], v[3]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertEquals(r, expected)
-    end
-end
-
-function TestValueMatching:test_wrong_data()
-    local tests = {
-        {'>= 200 && < 300', "foo", false},
-        {'>= 200 && < 300', ""   , false},
-        {'== 200'         , "bar", false},
-        {'== foo'         , "10" , false},
-        {'!= foo'         , " 10", true},
-    }
-    for _, v in ipairs(tests) do
-        local exp, value, expected = v[1], v[2], v[3]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertEquals(r, expected)
-    end
-end
-
-function TestValueMatching:test_precedence()
-    local tests = {
-        {'>= 200 && < 300 || >500', "200", true},
-        {'>= 200 && < 300 || >500', "501", true},
-        {'>= 200 && < 300 || >=500', "500", true},
-        {'>400 || >= 200 && < 300', "500", true},
-        {'>=300 && <500 || >= 200 && < 300', "300", true},
-        {'>=300 && <500 || >= 200 && < 300', "500", false},
-    }
-
-    for _, v in ipairs(tests) do
-        local exp, value, expected = v[1], v[2], v[3]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertEquals(r, expected)
-    end
-end
-
-function TestValueMatching:test_pattern_matching()
-    local tests = {
-        {'=~ /var/lib/ceph/osd/ceph%-%d+', "/var/lib/ceph/osd/ceph-1", true},
-        {'=~ /var/lib/ceph/osd/ceph%-%d+', "/var/lib/ceph/osd/ceph-42", true},
-        {'=~ ^/var/lib/ceph/osd/ceph%-%d+$', "/var/lib/ceph/osd/ceph-42", true},
-        {'=~ "/var/lib/ceph/osd/ceph%-%d+"', "/var/lib/ceph/osd/ceph-42", true},
-        {'=~ "ceph%-%d+"', "/var/lib/ceph/osd/ceph-42", true},
-        {'=~ "/var/lib/ceph/osd/ceph%-%d+$"', "/var/lib/ceph/osd/ceph-42 ", false}, -- trailing space
-        {'=~ /var/lib/ceph/osd/ceph%-%d+', "/var/log", false},
-        {'=~ /var/lib/ceph/osd/ceph%-%d+ || foo', "/var/lib/ceph/osd/ceph-1", true},
-        {'=~ "foo||bar" || foo', "foo||bar", true},
-        {'=~ "foo||bar" || foo', "foo", true},
-        {'=~ "foo&&bar" || foo', "foo&&bar", true},
-        {'=~ "foo&&bar" || foo', "foo", true},
-        {'=~ bar && /var/lib/ceph/osd/ceph%-%d+', "/var/lib/ceph/osd/ceph-1", false},
-        {'=~ -', "-", true},
-        {'=~ %-', "-", true},
-        {'!~ /var/lib/ceph/osd/ceph', "/var/log", true},
-        {'!~ /var/lib/ceph/osd/ceph%-%d+', "/var/log", true},
-        {'!~ .+osd%-%d+', "/var/log", true},
-        {'!~ osd%-%d+', "/var/log", true},
-        --{'=~ [', "[", true},
-    }
-
-    for _, v in ipairs(tests) do
-        local exp, value, expected = v[1], v[2], v[3]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertEquals(r, expected)
-    end
-end
-
-function TestValueMatching:test_wrong_patterns_never_match()
-    -- These patterns raise errors like:
-    -- malformed pattern (missing ']')
-    local tests = {
-        {'=~ [', "[", false},
-        {'!~ [', "[", false},
-    }
-
-    for _, v in ipairs(tests) do
-        local exp, value, expected = v[1], v[2], v[3]
-        local m = M.new(exp)
-        r = m:matches(value)
-        assertEquals(r, expected)
-    end
-end
-
-lu = LuaUnit
-lu:setVerbosity( 1 )
-os.exit( lu:run() )
diff --git a/tests/run_lua_tests.sh b/tests/run_lua_tests.sh
deleted file mode 100755
index 7a6b472..0000000
--- a/tests/run_lua_tests.sh
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env bash
-
-## Functions
-
-log_info() {
-    echo "[INFO] $*"
-}
-
-log_err() {
-    echo "[ERROR] $*" >&2
-}
-
-_atexit() {
-    RETVAL=$?
-    trap true INT TERM EXIT
-
-    if [ $RETVAL -ne 0 ]; then
-        log_err "Execution failed"
-    else
-        log_info "Execution successful"
-    fi
-    return $RETVAL
-}
-
-## Main
-
-[ -n "$DEBUG" ] && set -x
-
-LUA_VERSION=$(lua -v 2>&1)
-if [[ $? -ne 0 ]]; then
-    log_err "No lua interpreter present"
-    exit $?
-fi
-if [[ ! $LUA_VERSION =~ [Lua\ 5\.1] ]]; then
-    log_err "Lua version 5.1 is required"
-    exit 1
-fi
-
-lua5.1 -e "require('lpeg')" > /dev/null 2>&1
-if [[ $? -ne 0 ]]; then
-    log_err "lua-lpeg is required (run apt-get install lua-lpeg)"
-    exit 1
-fi
-
-lua5.1 -e "require('cjson')" > /dev/null 2>&1
-if [[ $? -ne 0 ]]; then
-    log_err "lua-cjson is required (run apt-get install lua-cjson)"
-    exit 1
-fi
-
-for pgm in "cmake wget curl"; do
-    which $pgm > /dev/null 2>&1
-    if [[ $? -ne 0 ]]; then
-        log_err "$pgm is required (run apt-get install $pgm)"
-        exit 1
-    fi
-done
-
-if [[ ! -f /usr/lib/x86_64-linux-gnu/liblua5.1.so ]]; then
-    log_err "package liblua5.1-0-dev is not installed (run apt-get install liblua5.1-0-dev)"
-    exit 1
-fi
-
-set -e
-
-curl -s -o lua/mocks/annotation.lua "https://raw.githubusercontent.com/mozilla-services/heka/versions/0.10/sandbox/lua/modules/annotation.lua"
-curl -s -o lua/mocks/anomaly.lua "https://raw.githubusercontent.com/mozilla-services/heka/versions/0.10/sandbox/lua/modules/anomaly.lua"
-curl -s -o lua/mocks/date_time.lua "https://raw.githubusercontent.com/mozilla-services/lua_sandbox/97331863d3e05d25131b786e3e9199e805b9b4ba/modules/date_time.lua"
-curl -s -o lua/mocks/inspect.lua "https://raw.githubusercontent.com/kikito/inspect.lua/master/inspect.lua"
-
-CBUF_COMMIT="bb6dd9f88f148813315b5a660b7e2ba47f958b31"
-CBUF_TARBALL_URL="https://github.com/mozilla-services/lua_circular_buffer/archive/${CBUF_COMMIT}.tar.gz"
-CBUF_DIR="/tmp/lua_circular_buffer-${CBUF_COMMIT}"
-CBUF_SO="${CBUF_DIR}/release/circular_buffer.so"
-if [[ ! -f "${CBUF_SO}" ]]; then
-    rm -rf ${CBUF_DIR}
-    wget -qO - ${CBUF_TARBALL_URL} | tar -zxvf - -C /tmp
-    (cd ${CBUF_DIR} && mkdir release && cd release && cmake -DCMAKE_BUILD_TYPE=release .. && make)
-    cp ${CBUF_SO} ./
-fi
-
-for t in $(ls lua/test_*.lua); do
-    lua5.1 $t
-done
-
-trap _atexit INT TERM EXIT
