diff --git a/tools/bionicbb/build_listener.py b/tools/bionicbb/build_listener.py
index b63c18d..f7f52ed 100644
--- a/tools/bionicbb/build_listener.py
+++ b/tools/bionicbb/build_listener.py
@@ -1,6 +1,19 @@
 #!/usr/bin/env python2
-# pylint: disable=bad-indentation
-# vim: set sw=2 ts=2:
+#
+# Copyright (C) 2015 The Android Open Source Project
+#
+# 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 json
 import requests
 import termcolor
@@ -12,93 +25,94 @@
 
 
 def gerrit_url(endpoint):
-  gerrit_base_url = 'https://android-review.googlesource.com'
-  return gerrit_base_url + endpoint
+    gerrit_base_url = 'https://android-review.googlesource.com'
+    return gerrit_base_url + endpoint
 
 
 @app.route('/', methods=['POST'])
 def handle_build_message():
-  result = json.loads(request.data)
+    result = json.loads(request.data)
 
-  name = result['name']
-  number = result['build']['number']
-  status = result['build']['status']
-  go_url = 'http://go/bionicbb/' + result['build']['url']
-  full_url = result['build']['full_url']
-  params = result['build']['parameters']
-  change_id = params['CHANGE_ID']
-  ref = params['REF']
-  patch_set = ref.split('/')[-1]
+    name = result['name']
+    number = result['build']['number']
+    status = result['build']['status']
+    go_url = 'http://go/bionicbb/' + result['build']['url']
+    full_url = result['build']['full_url']
+    params = result['build']['parameters']
+    change_id = params['CHANGE_ID']
+    ref = params['REF']
+    patch_set = ref.split('/')[-1]
 
-  print '{} #{} {}: {}'.format(name, number, status, full_url)
+    print '{} #{} {}: {}'.format(name, number, status, full_url)
 
-  # bionic-lint is always broken, so we don't want to reject changes for those
-  # failures until we clean things up.
-  if name == 'bionic-presubmit':
-    message_lines = ['{} #{} checkbuild {}: {}'.format(
-        name, number, status, go_url)]
-    if status == 'FAILURE':
-      message_lines += ['If you believe this Verified-1 was in error, +1 the '
-                        'change and bionicbb will remove the -1 shortly.']
+    # bionic-lint is always broken, so we don't want to reject changes for
+    # those failures until we clean things up.
+    if name == 'bionic-presubmit':
+        message_lines = ['{} #{} checkbuild {}: {}'.format(
+            name, number, status, go_url)]
+        if status == 'FAILURE':
+            message_lines += ['If you believe this Verified-1 was in error, '
+                              '+1 the change and bionicbb will remove the -1 '
+                              'shortly.']
 
-    request_data = {
-        'message': '\n'.join(message_lines)
-    }
+        request_data = {
+            'message': '\n'.join(message_lines)
+        }
 
-    label = 'Verified'
-    if status == 'FAILURE':
-      request_data['labels'] = {label: -1}
-    elif status == 'SUCCESS':
-      request_data['labels'] = {label: +1}
+        label = 'Verified'
+        if status == 'FAILURE':
+            request_data['labels'] = {label: -1}
+        elif status == 'SUCCESS':
+            request_data['labels'] = {label: +1}
 
-    url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
-                                                                patch_set))
+        url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
+                                                                    patch_set))
 
-    headers = {'Content-Type': 'application/json;charset=UTF-8'}
-    print 'POST {}: {}'.format(url, request_data)
-    print requests.post(url, headers=headers, json=request_data)
-  elif name == 'clean-bionic-presubmit':
-    request_data = {'message': 'out/ directory removed'}
-    url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
-                                                                patch_set))
-    headers = {'Content-Type': 'application/json;charset=UTF-8'}
-    print 'POST {}: {}'.format(url, request_data)
-    print requests.post(url, headers=headers, json=request_data)
-  elif name == 'bionic-lint':
-    print 'IGNORED'
-  else:
-    print '{}: {}'.format(termcolor.colored('red', 'UNKNOWN'), name)
-  return ''
+        headers = {'Content-Type': 'application/json;charset=UTF-8'}
+        print 'POST {}: {}'.format(url, request_data)
+        print requests.post(url, headers=headers, json=request_data)
+    elif name == 'clean-bionic-presubmit':
+        request_data = {'message': 'out/ directory removed'}
+        url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
+                                                                    patch_set))
+        headers = {'Content-Type': 'application/json;charset=UTF-8'}
+        print 'POST {}: {}'.format(url, request_data)
+        print requests.post(url, headers=headers, json=request_data)
+    elif name == 'bionic-lint':
+        print 'IGNORED'
+    else:
+        print '{}: {}'.format(termcolor.colored('red', 'UNKNOWN'), name)
+    return ''
 
 
 @app.route('/drop-rejection', methods=['POST'])
 def drop_rejection():
-  revision_info = json.loads(request.data)
+    revision_info = json.loads(request.data)
 
-  change_id = revision_info['changeid']
-  patch_set = revision_info['patchset']
+    change_id = revision_info['changeid']
+    patch_set = revision_info['patchset']
 
-  bb_email = 'bionicbb@android.com'
-  labels = gerrit.get_labels(change_id, patch_set)
-  if bb_email in labels['Verified']:
-    bb_review = labels['Verified'][bb_email]
-  else:
-    bb_review = 0
+    bb_email = 'bionicbb@android.com'
+    labels = gerrit.get_labels(change_id, patch_set)
+    if bb_email in labels['Verified']:
+        bb_review = labels['Verified'][bb_email]
+    else:
+        bb_review = 0
 
-  if bb_review >= 0:
-    print 'No rejection to drop: {} {}'.format(change_id, patch_set)
+    if bb_review >= 0:
+        print 'No rejection to drop: {} {}'.format(change_id, patch_set)
+        return ''
+
+    print 'Dropping rejection: {} {}'.format(change_id, patch_set)
+
+    request_data = {'labels': {'Verified': 0}}
+    url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
+                                                                patch_set))
+    headers = {'Content-Type': 'application/json;charset=UTF-8'}
+    print 'POST {}: {}'.format(url, request_data)
+    print requests.post(url, headers=headers, json=request_data)
     return ''
 
-  print 'Dropping rejection: {} {}'.format(change_id, patch_set)
-
-  request_data = {'labels': {'Verified': 0}}
-  url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
-                                                              patch_set))
-  headers = {'Content-Type': 'application/json;charset=UTF-8'}
-  print 'POST {}: {}'.format(url, request_data)
-  print requests.post(url, headers=headers, json=request_data)
-  return ''
-
 
 if __name__ == "__main__":
-  app.run(host='0.0.0.0', debug=True)
+    app.run(host='0.0.0.0', debug=True)
diff --git a/tools/bionicbb/gerrit.py b/tools/bionicbb/gerrit.py
index 51df4fb..a3d5887 100644
--- a/tools/bionicbb/gerrit.py
+++ b/tools/bionicbb/gerrit.py
@@ -1,56 +1,69 @@
-# pylint: disable=bad-indentation
-# vim: set sw=2 ts=2:
+#
+# Copyright (C) 2015 The Android Open Source Project
+#
+# 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 json
 import requests
 
 
 class GerritError(RuntimeError):
-  def __init__(self, code, url):
-    self.code = code
-    self.url = url
-    super(GerritError, self).__init__('Error {}: {}'.format(code, url))
+    def __init__(self, code, url):
+        self.code = code
+        self.url = url
+        super(GerritError, self).__init__('Error {}: {}'.format(code, url))
 
 
 def call(endpoint, method='GET'):
-  if method != 'GET':
-    raise NotImplementedError('Currently only HTTP GET is supported.')
-  gerrit_url = 'https://android-review.googlesource.com'
-  url = gerrit_url + endpoint
-  response = requests.get(url)
-  if response.status_code != 200:
-    raise GerritError(response.status_code, url)
-  return response.text[5:]
+    if method != 'GET':
+        raise NotImplementedError('Currently only HTTP GET is supported.')
+    gerrit_url = 'https://android-review.googlesource.com'
+    url = gerrit_url + endpoint
+    response = requests.get(url)
+    if response.status_code != 200:
+        raise GerritError(response.status_code, url)
+    return response.text[5:]
 
 
 def ref_for_change(change_id):
-  endpoint = '/changes/{}/detail?o=CURRENT_REVISION'.format(change_id)
-  change = json.loads(call(endpoint))
-  commit = change['current_revision']
-  return change['revisions'][commit]['fetch']['http']['ref']
+    endpoint = '/changes/{}/detail?o=CURRENT_REVISION'.format(change_id)
+    change = json.loads(call(endpoint))
+    commit = change['current_revision']
+    return change['revisions'][commit]['fetch']['http']['ref']
 
 
 def get_labels(change_id, patch_set):
-  """Returns labels attached to a revision.
+    """Returns labels attached to a revision.
 
-  Returned data is in the following format:
-  {
-      'Code-Review': {
-          <email>: <value>,
-          ...
-      },
-      'Verified': {
-          <email>: <value>,
-          ...
-      }
-  }
-  """
-  details = call('/changes/{}/revisions/{}/review'.format(
-      change_id, patch_set))
-  labels = {'Code-Review': {}, 'Verified': {}}
-  for review in details['labels']['Code-Review']['all']:
-    if 'value' in review and 'email' in review:
-      labels['Code-Review'][review['email']] = int(review['value'])
-  for review in details['labels']['Verified']['all']:
-    if 'value' in review and 'email' in review:
-      labels['Verified'][review['email']] = int(review['value'])
-  return labels
+    Returned data is in the following format:
+    {
+        'Code-Review': {
+            <email>: <value>,
+            ...
+        },
+        'Verified': {
+            <email>: <value>,
+            ...
+        }
+    }
+    """
+    details = call('/changes/{}/revisions/{}/review'.format(
+        change_id, patch_set))
+    labels = {'Code-Review': {}, 'Verified': {}}
+    for review in details['labels']['Code-Review']['all']:
+        if 'value' in review and 'email' in review:
+            labels['Code-Review'][review['email']] = int(review['value'])
+    for review in details['labels']['Verified']['all']:
+        if 'value' in review and 'email' in review:
+            labels['Verified'][review['email']] = int(review['value'])
+    return labels
diff --git a/tools/bionicbb/gmail_listener.py b/tools/bionicbb/gmail_listener.py
index 95ae3ae..8718484 100644
--- a/tools/bionicbb/gmail_listener.py
+++ b/tools/bionicbb/gmail_listener.py
@@ -1,6 +1,19 @@
 #!/usr/bin/env python2
-# pylint: disable=bad-indentation
-# vim: set sw=2 ts=2:
+#
+# Copyright (C) 2015 The Android Open Source Project
+#
+# 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 base64
 import httplib
 import httplib2
@@ -20,228 +33,229 @@
 
 
 class GmailError(RuntimeError):
-  def __init__(self, message):
-    super(GmailError, self).__init__(message)
+    def __init__(self, message):
+        super(GmailError, self).__init__(message)
 
 
 def get_gerrit_label(labels):
-  for label in labels:
-    if label['name'] == 'gerrit':
-      return label['id']
-  return None
+    for label in labels:
+        if label['name'] == 'gerrit':
+            return label['id']
+    return None
 
 
 def get_headers(msg):
-  headers = {}
-  for hdr in msg['payload']['headers']:
-    headers[hdr['name']] = hdr['value']
-  return headers
+    headers = {}
+    for hdr in msg['payload']['headers']:
+        headers[hdr['name']] = hdr['value']
+    return headers
 
 
 def build_service():
-  from apiclient.discovery import build
-  from oauth2client.client import flow_from_clientsecrets
-  from oauth2client.file import Storage
-  from oauth2client.tools import run
+    from apiclient.discovery import build
+    from oauth2client.client import flow_from_clientsecrets
+    from oauth2client.file import Storage
+    from oauth2client.tools import run
 
-  OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.modify'
-  STORAGE = Storage('oauth.storage')
+    OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.modify'
+    STORAGE = Storage('oauth.storage')
 
-  # Start the OAuth flow to retrieve credentials
-  flow = flow_from_clientsecrets(config.client_secret_file, scope=OAUTH_SCOPE)
-  http = httplib2.Http()
+    # Start the OAuth flow to retrieve credentials
+    flow = flow_from_clientsecrets(config.client_secret_file,
+                                   scope=OAUTH_SCOPE)
+    http = httplib2.Http()
 
-  # Try to retrieve credentials from storage or run the flow to generate them
-  credentials = STORAGE.get()
-  if credentials is None or credentials.invalid:
-    credentials = run(flow, STORAGE, http=http)
+    # Try to retrieve credentials from storage or run the flow to generate them
+    credentials = STORAGE.get()
+    if credentials is None or credentials.invalid:
+        credentials = run(flow, STORAGE, http=http)
 
-  http = credentials.authorize(http)
-  return build('gmail', 'v1', http=http)
+    http = credentials.authorize(http)
+    return build('gmail', 'v1', http=http)
 
 
 def get_all_messages(service, label):
-  msgs = []
-  response = service.users().messages().list(
-      userId='me', labelIds=label).execute()
-  if 'messages' in response:
-    msgs.extend(response['messages'])
-  while 'nextPageToken' in response:
-    page_token = response['nextPageToken']
+    msgs = []
     response = service.users().messages().list(
-        userId='me', pageToken=page_token).execute()
-    msgs.extend(response['messages'])
-  return msgs
+        userId='me', labelIds=label).execute()
+    if 'messages' in response:
+        msgs.extend(response['messages'])
+    while 'nextPageToken' in response:
+        page_token = response['nextPageToken']
+        response = service.users().messages().list(
+            userId='me', pageToken=page_token).execute()
+        msgs.extend(response['messages'])
+    return msgs
 
 
 def get_body(msg):
-  if 'attachmentId' in msg['payload']['body']:
-    raise NotImplementedError('Handling of messages contained in '
-                              'attachments not yet implemented.')
-  b64_body = msg['payload']['body']['data']
-  return base64.urlsafe_b64decode(b64_body.encode('ASCII'))
+    if 'attachmentId' in msg['payload']['body']:
+        raise NotImplementedError('Handling of messages contained in '
+                                  'attachments not yet implemented.')
+    b64_body = msg['payload']['body']['data']
+    return base64.urlsafe_b64decode(b64_body.encode('ASCII'))
 
 
 def get_gerrit_info(body):
-  info = {}
-  gerrit_pattern = r'^Gerrit-(\S+): (.+)$'
-  for match in re.finditer(gerrit_pattern, body, flags=re.MULTILINE):
-    info[match.group(1)] = match.group(2).strip()
-  return info
+    info = {}
+    gerrit_pattern = r'^Gerrit-(\S+): (.+)$'
+    for match in re.finditer(gerrit_pattern, body, flags=re.MULTILINE):
+        info[match.group(1)] = match.group(2).strip()
+    return info
 
 
 def clean_project(gerrit_info, dry_run):
-  username = config.jenkins_credentials['username']
-  password = config.jenkins_credentials['password']
-  jenkins_url = config.jenkins_url
-  jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password)
+    username = config.jenkins_credentials['username']
+    password = config.jenkins_credentials['password']
+    jenkins_url = config.jenkins_url
+    jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password)
 
-  build = 'clean-bionic-presubmit'
-  if build in jenkins:
-    if not dry_run:
-      job = jenkins[build].invoke()
-      url = job.get_build().baseurl
+    build = 'clean-bionic-presubmit'
+    if build in jenkins:
+        if not dry_run:
+            job = jenkins[build].invoke()
+            url = job.get_build().baseurl
+        else:
+            url = 'DRY_RUN_URL'
+        print '{}({}): {} {}'.format(
+            termcolor.colored('CLEAN', 'green'),
+            gerrit_info['MessageType'],
+            build,
+            url)
     else:
-      url = 'DRY_RUN_URL'
-    print '{}({}): {} {}'.format(
-        termcolor.colored('CLEAN', 'green'),
-        gerrit_info['MessageType'],
-        build,
-        url)
-  else:
-    print '{}({}): {}'.format(
-        termcolor.colored('CLEAN', 'red'),
-        gerrit_info['MessageType'],
-        termcolor.colored(build, 'red'))
-  return True
+        print '{}({}): {}'.format(
+            termcolor.colored('CLEAN', 'red'),
+            gerrit_info['MessageType'],
+            termcolor.colored(build, 'red'))
+    return True
 
 
 def build_project(gerrit_info, dry_run):
-  project_to_jenkins_map = {
-      'platform/bionic': 'bionic-presubmit',
-      'platform/build': 'bionic-presubmit',
-      'platform/external/jemalloc': 'bionic-presubmit',
-      'platform/external/libcxx': 'bionic-presubmit',
-      'platform/external/libcxxabi': 'bionic-presubmit',
-      'platform/external/compiler-rt': 'bionic-presubmit',
-  }
-
-  username = config.jenkins_credentials['username']
-  password = config.jenkins_credentials['password']
-  jenkins_url = config.jenkins_url
-  jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password)
-
-  project = gerrit_info['Project']
-  change_id = gerrit_info['Change-Id']
-  if project in project_to_jenkins_map:
-    build = project_to_jenkins_map[project]
-  else:
-    build = 'bionic-presubmit'
-
-  if build in jenkins:
-    project_path = '/'.join(project.split('/')[1:])
-    if not project_path:
-      raise RuntimeError('bogus project: {}'.format(project))
-    if project_path.startswith('platform/'):
-      print '{}({}): {} => {}'.format(
-          termcolor.colored('ERROR', 'red'),
-          'project',
-          project,
-          project_path)
-      return False
-    try:
-      ref = gerrit.ref_for_change(change_id)
-    except gerrit.GerritError as ex:
-      print '{}({}): {} {}'.format(
-          termcolor.colored('GERRIT-ERROR', 'red'),
-          ex.code,
-          change_id,
-          ex.url)
-      return False
-    params = {
-        'REF': ref,
-        'CHANGE_ID': change_id,
-        'PROJECT': project_path
+    project_to_jenkins_map = {
+        'platform/bionic': 'bionic-presubmit',
+        'platform/build': 'bionic-presubmit',
+        'platform/external/jemalloc': 'bionic-presubmit',
+        'platform/external/libcxx': 'bionic-presubmit',
+        'platform/external/libcxxabi': 'bionic-presubmit',
+        'platform/external/compiler-rt': 'bionic-presubmit',
     }
-    if not dry_run:
-      job = jenkins[build].invoke(build_params=params)
-      url = job.get_build().baseurl
+
+    username = config.jenkins_credentials['username']
+    password = config.jenkins_credentials['password']
+    jenkins_url = config.jenkins_url
+    jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password)
+
+    project = gerrit_info['Project']
+    change_id = gerrit_info['Change-Id']
+    if project in project_to_jenkins_map:
+        build = project_to_jenkins_map[project]
     else:
-      url = 'DRY_RUN_URL'
-    print '{}({}): {} => {} {} {}'.format(
-        termcolor.colored('BUILD', 'green'),
-        gerrit_info['MessageType'],
-        project,
-        build,
-        url,
-        change_id)
-  else:
-    print '{}({}): {} => {} {}'.format(
-        termcolor.colored('BUILD', 'red'),
-        gerrit_info['MessageType'],
-        project,
-        termcolor.colored(build, 'red'),
-        change_id)
-  return True
+        build = 'bionic-presubmit'
+
+    if build in jenkins:
+        project_path = '/'.join(project.split('/')[1:])
+        if not project_path:
+            raise RuntimeError('bogus project: {}'.format(project))
+        if project_path.startswith('platform/'):
+            print '{}({}): {} => {}'.format(
+                termcolor.colored('ERROR', 'red'),
+                'project',
+                project,
+                project_path)
+            return False
+        try:
+            ref = gerrit.ref_for_change(change_id)
+        except gerrit.GerritError as ex:
+            print '{}({}): {} {}'.format(
+                termcolor.colored('GERRIT-ERROR', 'red'),
+                ex.code,
+                change_id,
+                ex.url)
+            return False
+        params = {
+            'REF': ref,
+            'CHANGE_ID': change_id,
+            'PROJECT': project_path
+        }
+        if not dry_run:
+            job = jenkins[build].invoke(build_params=params)
+            url = job.get_build().baseurl
+        else:
+            url = 'DRY_RUN_URL'
+        print '{}({}): {} => {} {} {}'.format(
+            termcolor.colored('BUILD', 'green'),
+            gerrit_info['MessageType'],
+            project,
+            build,
+            url,
+            change_id)
+    else:
+        print '{}({}): {} => {} {}'.format(
+            termcolor.colored('BUILD', 'red'),
+            gerrit_info['MessageType'],
+            project,
+            termcolor.colored(build, 'red'),
+            change_id)
+    return True
 
 
 def handle_change(gerrit_info, _, dry_run):
-  return build_project(gerrit_info, dry_run)
+    return build_project(gerrit_info, dry_run)
 handle_newchange = handle_change
 handle_newpatchset = handle_change
 
 
 def drop_rejection(gerrit_info, dry_run):
-  request_data = {
-      'changeid': gerrit_info['Change-Id'],
-      'patchset': gerrit_info['PatchSet']
-  }
-  url = '{}/{}'.format(config.build_listener_url, 'drop-rejection')
-  headers = {'Content-Type': 'application/json;charset=UTF-8'}
-  if not dry_run:
-    try:
-      requests.post(url, headers=headers, data=json.dumps(request_data))
-    except requests.exceptions.ConnectionError as ex:
-      print '{}(drop-rejection): {}'.format(
-          termcolor.colored('ERROR', 'red'), ex)
-      return False
-  print '{}({}): {}'.format(
-      termcolor.colored('CHECK', 'green'),
-      gerrit_info['MessageType'],
-      gerrit_info['Change-Id'])
-  return True
+    request_data = {
+        'changeid': gerrit_info['Change-Id'],
+        'patchset': gerrit_info['PatchSet']
+    }
+    url = '{}/{}'.format(config.build_listener_url, 'drop-rejection')
+    headers = {'Content-Type': 'application/json;charset=UTF-8'}
+    if not dry_run:
+        try:
+            requests.post(url, headers=headers, data=json.dumps(request_data))
+        except requests.exceptions.ConnectionError as ex:
+            print '{}(drop-rejection): {}'.format(
+                termcolor.colored('ERROR', 'red'), ex)
+            return False
+    print '{}({}): {}'.format(
+        termcolor.colored('CHECK', 'green'),
+        gerrit_info['MessageType'],
+        gerrit_info['Change-Id'])
+    return True
 
 
 def handle_comment(gerrit_info, body, dry_run):
-  if 'Verified+1' in body:
-    drop_rejection(gerrit_info, dry_run)
+    if 'Verified+1' in body:
+        drop_rejection(gerrit_info, dry_run)
 
-  command_map = {
-      'clean': lambda: clean_project(gerrit_info, dry_run),
-      'retry': lambda: build_project(gerrit_info, dry_run),
-  }
+    command_map = {
+        'clean': lambda: clean_project(gerrit_info, dry_run),
+        'retry': lambda: build_project(gerrit_info, dry_run),
+    }
 
-  def handle_unknown_command():
-    pass  # TODO(danalbert): should complain to the commenter.
+    def handle_unknown_command():
+        pass    # TODO(danalbert): should complain to the commenter.
 
-  commands = [match.group(1).strip() for match in
-              re.finditer(r'^bionicbb:\s*(.+)$', body, flags=re.MULTILINE)]
+    commands = [match.group(1).strip() for match in
+                re.finditer(r'^bionicbb:\s*(.+)$', body, flags=re.MULTILINE)]
 
-  for command in commands:
-    if command in command_map:
-      command_map[command]()
-    else:
-      handle_unknown_command()
+    for command in commands:
+        if command in command_map:
+            command_map[command]()
+        else:
+            handle_unknown_command()
 
-  return True
+    return True
 
 
 def skip_handler(gerrit_info, _, __):
-  print '{}({}): {}'.format(
-      termcolor.colored('SKIP', 'yellow'),
-      gerrit_info['MessageType'],
-      gerrit_info['Change-Id'])
-  return True
+    print '{}({}): {}'.format(
+        termcolor.colored('SKIP', 'yellow'),
+        gerrit_info['MessageType'],
+        gerrit_info['Change-Id'])
+    return True
 handle_abandon = skip_handler
 handle_merged = skip_handler
 handle_restore = skip_handler
@@ -249,62 +263,63 @@
 
 
 def process_message(msg, dry_run):
-  try:
-    body = get_body(msg)
-    gerrit_info = get_gerrit_info(body)
-    if not gerrit_info:
-      print termcolor.colored('No info found: {}'.format(msg['id']), 'red')
-    msg_type = gerrit_info['MessageType']
-    handler = 'handle_{}'.format(gerrit_info['MessageType'])
-    if handler in globals():
-      return globals()[handler](gerrit_info, body, dry_run)
-    else:
-      print termcolor.colored(
-          'MessageType {} unhandled.'.format(msg_type), 'red')
-    print
-    return False
-  except NotImplementedError as ex:
-    print ex
-    return False
+    try:
+        body = get_body(msg)
+        gerrit_info = get_gerrit_info(body)
+        if not gerrit_info:
+            print termcolor.colored('No info found: {}'.format(msg['id']),
+                                    'red')
+        msg_type = gerrit_info['MessageType']
+        handler = 'handle_{}'.format(gerrit_info['MessageType'])
+        if handler in globals():
+            return globals()[handler](gerrit_info, body, dry_run)
+        else:
+            print termcolor.colored(
+                'MessageType {} unhandled.'.format(msg_type), 'red')
+        print
+        return False
+    except NotImplementedError as ex:
+        print ex
+        return False
 
 
 def main(argc, argv):
-  dry_run = False
-  if argc == 2 and argv[1] == '--dry-run':
-    dry_run = True
-  elif argc > 2:
-    sys.exit('usage: python {} [--dry-run]'.format(argv[0]))
+    dry_run = False
+    if argc == 2 and argv[1] == '--dry-run':
+        dry_run = True
+    elif argc > 2:
+        sys.exit('usage: python {} [--dry-run]'.format(argv[0]))
 
-  gmail_service = build_service()
-  msg_service = gmail_service.users().messages()
+    gmail_service = build_service()
+    msg_service = gmail_service.users().messages()
 
-  while True:
-    try:
-      labels = gmail_service.users().labels().list(userId='me').execute()
-      if not labels['labels']:
-        raise GmailError('Could not retrieve Gmail labels')
-      label_id = get_gerrit_label(labels['labels'])
-      if not label_id:
-        raise GmailError('Could not find gerrit label')
+    while True:
+        try:
+            labels = gmail_service.users().labels().list(userId='me').execute()
+            if not labels['labels']:
+                raise GmailError('Could not retrieve Gmail labels')
+            label_id = get_gerrit_label(labels['labels'])
+            if not label_id:
+                raise GmailError('Could not find gerrit label')
 
-      for msg in get_all_messages(gmail_service, label_id):
-        msg = msg_service.get(userId='me', id=msg['id']).execute()
-        if process_message(msg, dry_run) and not dry_run:
-          msg_service.trash(userId='me', id=msg['id']).execute()
-      time.sleep(60 * 5)
-    except GmailError as ex:
-      print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex)
-      time.sleep(60 * 5)
-    except apiclient.errors.HttpError as ex:
-      print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex)
-      time.sleep(60 * 5)
-    except httplib.BadStatusLine:
-      pass
-    except httplib2.ServerNotFoundError:
-      pass
-    except socket.error:
-      pass
+            for msg in get_all_messages(gmail_service, label_id):
+                msg = msg_service.get(userId='me', id=msg['id']).execute()
+                if process_message(msg, dry_run) and not dry_run:
+                    msg_service.trash(userId='me', id=msg['id']).execute()
+            time.sleep(60 * 5)
+        except GmailError as ex:
+            print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex)
+            time.sleep(60 * 5)
+        except apiclient.errors.HttpError as ex:
+            print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex)
+            time.sleep(60 * 5)
+        except httplib.BadStatusLine:
+            pass
+        except httplib2.ServerNotFoundError:
+            pass
+        except socket.error:
+            pass
 
 
 if __name__ == '__main__':
-  main(len(sys.argv), sys.argv)
+    main(len(sys.argv), sys.argv)
diff --git a/tools/bionicbb/setup.cfg b/tools/bionicbb/setup.cfg
deleted file mode 100644
index 47cd585..0000000
--- a/tools/bionicbb/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[pep8]
-ignore = E111
