diff --git a/lts/README b/lts/README
new file mode 100644
index 0000000..1da63c8
--- /dev/null
+++ b/lts/README
@@ -0,0 +1,59 @@
+This directory contains code related to long-term support management of TF-A.
+
+lts-triage.py
+=============
+
+Purpose of this script is to check a patch and determine if that patch qualifies
+as a candidate for one of the LTS branches.
+
+Currently it focuses on cpu errata while it contains basic support for security
+patches. It computes a crude score:
+
+1 point if subject line matches tokens for cpu errata or security
+1 point for "report_errata ERRATA" in a lib/cpus/aarch{32,64}/*.S file
+1 point for "- ``ERRATA_" in docs/design/cpu-specific-build-macros.rst file
+
+Note that the script only looks at commits which are not merge commits.
+
+Running it:
+-----------
+
+To run it, provide it a path to a TF-A git repo. Here's help output for convenience:
+
+$ python lts/lts-triage.py -h
+usage: lts-triage.py [-h] --repo REPO [--branch BRANCH] [--sample_size SAMPLE_SIZE] [--debug]
+
+check patches for LTS candidacy
+
+options:
+  -h, --help            show this help message and exit
+  --repo REPO           path to tf-a git repo
+  --branch BRANCH       branch to check. default = integration
+  --sample_size SAMPLE_SIZE
+                        how many patches to scan. default = 20
+  --debug               print debug logs
+
+Below is an example output. On left is commit hash of each of the commits
+observed by this script and on right is score assigned to it.
+
+$ python lts/lts-triage.py --repo ../trusted-firmware-a/
+888eafa00b99aa06b4ff688407336811a7ff439a:    3
+79544126943a90d31d81177655be11f75330ffed:    3
+43438ad1ad6651964e9ae75d35f40aed8d86d088:    3
+028c4e42d8f632d40081b88f66d0d05c7d7c9b23:    0
+20155112c5d2fb296fef40a12b1c6ce12f49b1c8:    0
+4090ac33f44bd24d73161032faa817eb03f2e41d:    0
+cf58b2d41cb0d24239b98de98264b31690711549:    0
+e74d658181e5e69b6b5e16b40adc1ffef4c1efb9:    1
+ad6eb1951b986f30635025bbdf29e257b6b1e362:    0
+8a6a9560b5dcccfb68064c0c8c9b4b47981c6ac7:    0
+93cec697deb654303379cae8f25a31dc8b90cd31:    0
+a194255d75ed9e2ef56bd6e14349a3e7d86af934:    0
+98a43d9f6c22498d9e1a6e7ace1bc6d23ac58d5a:    0
+07dc8ba93b319de2bf0be0c287373db74019878e:    0
+c6877763cd3a286983df160c8207368174c1b820:    0
+03ebf409c711e9f2006cedded7dc415dfe566975:    1
+de7e9b562afccd6d71df1abf1907f48d164a3a7e:    0
+720e7b66f2353ef7ed32a8f85f8396fbc0766ffc:    0
+62a93aa7afcd022f06d322c36979f0aa02713beb:    0
+b5f06d3dfad8c27bdf528b083ef919ce4022c52d:    0
diff --git a/lts/lts-triage.py b/lts/lts-triage.py
new file mode 100644
index 0000000..5432c90
--- /dev/null
+++ b/lts/lts-triage.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2022 Google LLC. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+# quick hacky script to check patches if they are candidates for lts. it checks
+# only the non-merge commits.
+
+import pkg_resources
+import os
+import git
+import re
+import argparse
+from io import StringIO
+pkg_resources.require("unidiff>=0.7.4")
+from unidiff import PatchSet
+
+global_debug = False
+def debug_print(*args, **kwargs):
+    global global_var
+    if global_debug:
+        print(*args, **kwargs)
+
+def contains_re(pf, tok):
+    for hnk in pf:
+        for ln in hnk:
+            if ln.is_context:
+                continue
+            # here means the line is either added or removed
+            txt = ln.value.strip()
+            if tok.search(txt) is not None:
+                return True
+
+    return False
+
+def process_ps(ps):
+    score = 0
+
+    cpu_tok = re.compile(CPU_PATH_TOKEN)
+    doc_tok = re.compile(DOC_PATH_TOKEN)
+
+    for pf in ps:
+        if pf.is_binary_file or not pf.is_modified_file:
+            continue
+        if cpu_tok.search(pf.path) is not None:
+            debug_print("* change found in cpu path:", pf.path);
+            cpu_tok = re.compile(CPU_ERRATA_TOKEN)
+            if contains_re(pf, cpu_tok):
+                score = score + 1
+                debug_print("    found", CPU_ERRATA_TOKEN)
+
+        if doc_tok.search(pf.path) is not None:
+            debug_print("* change found in macros doc path:", pf.path);
+            doc_tok = re.compile(DOC_ERRATA_TOKEN)
+            if contains_re(pf, doc_tok):
+                score = score + 1
+                debug_print("    found", DOC_ERRATA_TOKEN)
+
+    return score
+
+SUBJECT_TOKENS = r'fix\(cpus\)|revert\(cpus\)|fix\(errata\)|\(security\)'
+CPU_PATH_TOKEN = r'lib/cpus/aarch(32|64)/.*\.S'
+CPU_ERRATA_TOKEN = r'^report_errata ERRATA_'
+DOC_PATH_TOKEN = r'docs/design/cpu-specific-build-macros.rst'
+DOC_ERRATA_TOKEN = r'^^-\s*``ERRATA_'
+SAMPLE_SIZE = 20
+
+## TODO: for case like 921081049ec3 where we need to refactor first for security
+#       patch to be applied then we should:
+#       1. find the security patch
+#       2. from that patch find CVE number if any
+#       3. look for all patches that contain that CVE number in commit message
+
+## TODO: similar to errata macros and rst file additions, we have CVE macros and rst file
+#       additions. so we can use similar logic for that.
+
+## TODO: for security we should look for CVE numbed regex match and if found flag it
+def main():
+    parser = argparse.ArgumentParser(prog="lts-triage.py", description="check patches for LTS candidacy")
+    parser.add_argument("--repo", required=True, help="path to tf-a git repo")
+    parser.add_argument("--branch", help="branch to check. default = integration", default="integration")
+    parser.add_argument("--sample_size", help="how many patches to scan. default = 20", default=SAMPLE_SIZE)
+    parser.add_argument("--debug", help="print debug logs", action="store_true")
+
+    args = parser.parse_args()
+    global global_debug
+    global_debug = args.debug
+
+    repo = git.Repo(args.repo)
+    cnt = int(args.sample_size)
+
+    # TODO: make sure that by iter_commits() we are traversing correctly in case of merge commits.
+    for cmt in repo.iter_commits(args.branch):
+        score = 0
+
+        # don't process merge commits
+        if len(cmt.parents) > 1:
+            continue
+
+        tok = re.compile(SUBJECT_TOKENS)
+        if tok.search(cmt.summary) is not None:
+            debug_print("## subject match")
+            score = score + 1
+
+        diff_text = repo.git.diff(cmt.hexsha + "~1", cmt.hexsha, ignore_blank_lines=True, ignore_space_at_eol=True)
+        ps = PatchSet(StringIO(diff_text))
+        debug_print("# score before process_ps:", score)
+        score = score + process_ps(ps)
+        debug_print("# score after process_ps:", score)
+
+        print("{}:    {}".format(cmt.hexsha, score))
+
+        cnt = cnt - 1
+        if cnt == 0:
+            break
+
+if __name__ == '__main__':
+    main()
