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
