diff --git a/scripts/add_copyright.py b/scripts/add_copyright.py
new file mode 100644
index 0000000..0304992
--- /dev/null
+++ b/scripts/add_copyright.py
@@ -0,0 +1,263 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# 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.
+
+import sys
+import os
+
+COPYRIGHTS = {
+    "slash": """
+/*
+ * Copyright 2017-present Open Networking Foundation
+
+ * 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.
+ */
+""",
+    "hash": """
+# Copyright 2017-present Open Networking Foundation
+#
+# 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.
+""",
+    "html": """
+<!--
+Copyright 2017-present Open Networking Foundation
+
+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.
+-->
+""",
+    "jinja": """
+{#
+Copyright 2017-present Open Networking Foundation
+
+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.
+#}
+""",
+    "ini": """
+;Copyright 2017-present Open Networking Foundation
+;
+;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.
+""",
+}
+
+EXT_MAPPING = {
+    ".js": COPYRIGHTS["slash"],
+    ".ts": COPYRIGHTS["slash"],
+    ".scss": COPYRIGHTS["slash"],
+    ".css": COPYRIGHTS["slash"],
+    ".gradle": COPYRIGHTS["slash"],
+
+    "docker": COPYRIGHTS["hash"],
+    ".py": COPYRIGHTS["hash"],
+    ".model": COPYRIGHTS["hash"], # attic files
+    ".sh": COPYRIGHTS["hash"],
+    ".yaml": COPYRIGHTS["hash"],
+    ".yml": COPYRIGHTS["hash"],
+    ".m4": COPYRIGHTS["hash"],
+    ".sql": COPYRIGHTS["hash"],
+
+    ".html": COPYRIGHTS["html"],
+    ".j2": COPYRIGHTS["jinja"],
+    ".ini": COPYRIGHTS["ini"],
+}
+
+def get_copyright(file):
+    name, ext = os.path.splitext(file)
+
+    if "Dockerfile" in name:
+        return EXT_MAPPING["docker"]
+    try:
+        return EXT_MAPPING[ext]
+    except KeyError, e:
+        print "Missing copyright for file of type: %s" % ext
+        return None
+
+def add_copyright(file):
+    with open(file, 'r') as original: data = original.read()
+    if not "Copyright 2017-present Open Networking Foundation" in data:
+        print "Adding copyright to: %s" % file
+
+        copy = get_copyright(file)
+        if copy:
+            with open(file, 'w') as modified: modified.write(copy + "\n\n" + data)
+    return
+
+def get_files_ignore_by_git(root):
+    # NOTE this is not perfect, some file will still be copyrighted, but we save some time
+    if root == ".gitignore":
+        gitignore = root
+    else:
+        gitignore = os.path.join(root, ".gitignore")
+
+    exclusion_list = []
+    if os.path.exists(gitignore):
+        for line in open(gitignore).readlines():
+            if not "#" in line:
+                line = line.strip()
+                if line.endswith("/"):
+                    line = line.replace("/", "")
+                exclusion_list.append(line)
+    return exclusion_list
+
+def should_skip(entry):
+
+    # do not skip directories
+    if os.path.isdir(entry):
+        return False
+
+    if "LICENSE.txt" in entry \
+    or ".git" in entry \
+    or ".idea" in entry:
+        return True
+
+    name, ext = os.path.splitext(entry)
+    if not ext or ext == "" \
+    or ext ==".pyc" \
+    or ext == ".txt" \
+    or ext == ".in" \
+    or ext == ".crt" \
+    or ext == ".unused" \
+    or ext == ".list" \
+    or ext == ".README" \
+    or ext == ".json" \
+    or ext == ".log" \
+    or ext == ".asc" \
+    or ext == ".dot" \
+    or ext == ".do" \
+    or ext == ".template" \
+    or ext == ".svg" \
+    or ext == ".ttf" \
+    or ext == ".woff" \
+    or ext == ".woof2" \
+    or ext == ".eot" \
+    or ext == ".md" \
+    or ext == ".png" \
+    or ext == ".PNG" \
+    or ext == ".jpg" \
+    or ext == ".gif" \
+    or ext == ".ico" \
+    or ext == ".conf"\
+    or ext == ".key" \
+    or ext == ".proto" \
+    or ext == ".xproto" \
+    or ext == ".xtarget" \
+    or ext == ".otf" \
+    or ext == ".desc":
+        return True
+    return False
+
+def recursive_iterate_dirs(source, apply_copyright=True):
+    # print "Iteranting on: %s" % source
+    # skipping files in the gitignore
+    gitignored = get_files_ignore_by_git(source)
+    entries = []
+    for entry in os.listdir(source):
+
+        if entry in gitignored:
+            # print "Skipping because gitignored: %s" % entry
+            continue
+
+        entry = os.path.join(source, entry)
+        if should_skip(entry):
+            # print "Skipping: %s" % entry
+            continue
+
+        if os.path.isdir(entry):
+            entries.append(recursive_iterate_dirs(entry, apply_copyright))
+        elif os.path.isfile(entry):
+            entries.append(entry)
+            if apply_copyright is True:
+                add_copyright(entry)
+    return entries
+
+def flatten(aList):
+    t = []
+    for i in aList:
+        if not isinstance(i, list):
+             t.append(i)
+        else:
+             t.extend(flatten(i))
+    return t
+
+def list_file_types(source):
+    file_types = []
+    files = flatten(recursive_iterate_dirs(source, apply_copyright=False))
+    for entry in files:
+        name, ext = os.path.splitext(entry)
+        if not ext in file_types:
+            file_types.append(ext)
+    print file_types
+
+def main():
+    if len(sys.argv) < 2:
+        raise Exception("You must provide a path to the source folder as arguments to the script")
+    source_root = os.path.abspath(os.path.join(os.getcwd(), sys.argv[1]))
+    if not os.path.exists(source_root):
+        raise Exception("You must provide an existing the source folder")
+    if len(sys.argv) == 3:
+        list_file_types(source_root)
+    else:
+        recursive_iterate_dirs(source_root)
+
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
