diff --git a/README.md b/README.md
index 7065806..a0445ba 100755
--- a/README.md
+++ b/README.md
@@ -157,3 +157,16 @@
     # Your code here.
 
 ```
+
+Command to get GitHub issues (any GitHub repository) report in CSV format
+
+```shell
+python ./tools/github_issues_to_csv <github user> <password> <github repo>
+
+Example for getting openbmc issues
+python ./tools/github_issues_to_csv <github user> <password>  openbmc/openbmc
+
+Example for getting openbmc-test-automation issues
+python ./tools/github_issues_to_csv <github user> <password>  openbmc/openbmc-test-automation
+
+```
diff --git a/tools/github_issues_to_csv b/tools/github_issues_to_csv
new file mode 100644
index 0000000..b51347e
--- /dev/null
+++ b/tools/github_issues_to_csv
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+
+r"""
+Exports issues from a list of repositories to individual CSV files.
+Uses basic authentication (GitHub username + password) to retrieve issues
+from a repository that username has access to. Supports GitHub API v3.
+"""
+import argparse
+import csv
+from getpass import getpass
+import requests
+
+auth = None
+states = 'all'
+
+
+def write_issues(response, csv_out):
+    r"""
+    Parses JSON response and writes to CSV.
+    """
+    print response
+    if response.status_code != 200:
+        raise Exception(response.status_code)
+    for issue in response.json():
+        if 'pull_request' not in issue:
+            labels = ', '.join([l['name'] for l in issue['labels']])
+            date = issue['created_at'].split('T')[0]
+            # Change the following line to write out additional fields
+            csv_out.writerow([labels.encode('utf-8'),
+                             issue['title'].encode('utf-8'),
+                             issue['state'].encode('utf-8'),
+                             date.encode('utf-8'),
+                             issue['html_url'].encode('utf-8'),
+                             issue['user']['login'].encode('utf-8')])
+
+
+def get_github_issues(name):
+    r"""
+    Requests issues from GitHub API and writes to CSV file.
+    """
+    print name
+    print states
+    l_url = 'https://api.github.com/repos/{}/issues?state={}'.format(name,
+                                                                     states)
+    print l_url
+    # 'https://api.github.com/repos/{}/issues?state={}'.format(name, state)
+    response = requests.get(l_url, auth=auth)
+
+    csvfilename = '{}-issues.csv'.format(name.replace('/', '-'))
+    with open(csvfilename, 'w') as csvfile:
+        csv_out = csv.writer(csvfile)
+        csv_out.writerow(['Labels', 'Title', 'State', 'Date', 'URL', 'Author'])
+        write_issues(response, csv_out)
+
+        # Multiple requests are required if response is paged
+        if 'link' in response.headers:
+            pages = {rel[6:-1]: url[url.index('<')+1:-1] for url, rel in
+                     (link.split(';') for link in
+                      response.headers['link'].split(','))}
+            while 'last' in pages and 'next' in pages:
+                pages = {rel[6:-1]: url[url.index('<')+1:-1] for url, rel in
+                         (link.split(';') for link in
+                          response.headers['link'].split(','))}
+                response = requests.get(pages['next'], auth=auth)
+                write_issues(response, csv_out)
+                if pages['next'] == pages['last']:
+                    break
+
+        csvfile.close()
+
+parser = argparse.ArgumentParser(description="Write GitHub repository issues "
+                                             "to CSV file.")
+
+parser.add_argument('username', nargs='+', help="GitHub user name, "
+                    "formatted as 'username'")
+
+parser.add_argument('password', nargs='+', help="GitHub username password, "
+                    "formatted as 'password'")
+
+parser.add_argument('repositories', nargs='+', help="Repository names, "
+                    "formatted as 'basereponame/repo'")
+
+parser.add_argument('--all', action='store_true', help="Returns both open "
+                    "and closed issues.")
+args = parser.parse_args()
+
+if args.all:
+    state = 'all'
+
+for argusername in args.username:
+    username = argusername
+
+for argpassword in args.password:
+    password = argpassword
+
+auth = (username, password)
+
+for repository in args.repositories:
+    get_github_issues(repository)
