diff --git a/contrib/__init__.py b/contrib/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/contrib/__init__.py
diff --git a/contrib/buzz/__init__.py b/contrib/buzz/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/contrib/buzz/__init__.py
diff --git a/contrib/buzz/simple_buzz_wrapper.py b/contrib/buzz/simple_buzz_wrapper.py
new file mode 100644
index 0000000..91c0cd0
--- /dev/null
+++ b/contrib/buzz/simple_buzz_wrapper.py
@@ -0,0 +1,71 @@
+# Copyright (C) 2010 Google Inc.
+#
+# 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 buzz_gae_client
+import logging
+
+class SimpleBuzzWrapper(object):
+  "Simple client that exposes the bare minimum set of common Buzz operations"
+
+  def __init__(self, api_key=None, consumer_key='anonymous', consumer_secret='anonymous',
+    oauth_token=None, oauth_token_secret=None):
+    
+    self.builder = buzz_gae_client.BuzzGaeClient(consumer_key, consumer_secret, api_key=api_key)
+    if oauth_token and oauth_token_secret:
+      logging.info('Using api_client with authorisation')
+      oauth_params_dict = {}
+      oauth_params_dict['consumer_key'] = consumer_key
+      oauth_params_dict['consumer_secret'] = consumer_secret
+      oauth_params_dict['oauth_token'] = oauth_token
+      oauth_params_dict['oauth_token_secret'] = oauth_token_secret
+      self.api_client = self.builder.build_api_client(oauth_params=oauth_params_dict)
+    else:
+      logging.info('Using api_client that doesn\'t have authorisation')
+      self.api_client = self.builder.build_api_client()
+
+  def search(self, query, user_token=None, max_results=10):
+    if query is None or query.strip() is '':
+      return None
+
+    json = self.api_client.activities().search(q=query, max_results=max_results).execute()
+    if json.has_key('items'):
+      return json['items']
+    return []
+
+  def post(self, sender, message_body):
+    if message_body is None or message_body.strip() is '':
+      return None
+
+    #TODO(ade) What happens with users who have hidden their email address?
+    # Maybe we should switch to @me so it won't matter?
+    user_id = sender.split('@')[0]
+
+    activities = self.api_client.activities()
+    logging.info('Retrieved activities for: %s' % user_id)
+    activity = activities.insert(userId=user_id, body={
+      'data' : {
+        'title': message_body,
+        'object': {
+          'content': message_body,
+          'type': 'note'}
+       }
+    }
+                                 ).execute()
+    url = activity['links']['alternate'][0]['href']
+    logging.info('Just created: %s' % url)
+    return url
+
+  def get_profile(self, user_id='@me'):
+    user_profile_data = self.api_client.people().get(userId=user_id).execute()
+    return user_profile_data
+
diff --git a/contrib_tests/__init__.py b/contrib_tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/contrib_tests/__init__.py
diff --git a/contrib_tests/test_simple_buzz_wrapper.py b/contrib_tests/test_simple_buzz_wrapper.py
new file mode 100644
index 0000000..6ccb0d9
--- /dev/null
+++ b/contrib_tests/test_simple_buzz_wrapper.py
@@ -0,0 +1,68 @@
+# Copyright (C) 2010 Google Inc.
+#
+# 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.
+
+from contrib.buzz.simple_buzz_wrapper import SimpleBuzzWrapper
+import unittest
+
+class SimpleBuzzWrapperTest(unittest.TestCase):
+# None of these tests make a remote call. We assume the underlying libraries
+# and servers are working.
+
+  def test_wrapper_rejects_empty_post(self):
+    wrapper = SimpleBuzzWrapper()
+    self.assertEquals(None, wrapper.post('sender@example.org', ''))
+
+  def test_wrapper_rejects_post_containing_only_whitespace(self):
+    wrapper = SimpleBuzzWrapper()
+    self.assertEquals(None, wrapper.post('sender@example.org', '            '))
+
+  def test_wrapper_rejects_none_post(self):
+    wrapper = SimpleBuzzWrapper()
+    self.assertEquals(None, wrapper.post('sender@example.org', None))
+
+  def test_wrapper_rejects_empty_search(self):
+	wrapper = SimpleBuzzWrapper()
+	self.assertEquals(None, wrapper.search(''))
+
+  def test_wrapper_rejects_search_containing_only_whitespace(self):
+	wrapper = SimpleBuzzWrapper()
+	self.assertEquals(None, wrapper.search(' '))
+
+  def test_wrapper_rejects_search_with_none(self):
+	wrapper = SimpleBuzzWrapper()
+	self.assertEquals(None, wrapper.search(None))
+
+class SimpleBuzzWrapperRemoteTest(unittest.TestCase):
+# These tests make remote calls
+	def test_searching_returns_results(self):
+		wrapper = SimpleBuzzWrapper()
+		results = wrapper.search('oshineye')
+		self.assertTrue(results is not None)
+	
+	def test_searching_honours_max_results(self):
+		wrapper = SimpleBuzzWrapper()
+		max = 5
+		results = wrapper.search('oshineye', max_results=max)
+		self.assertEquals(max, len(results))
+		
+	def test_can_fetch_profile(self):
+	  wrapper = SimpleBuzzWrapper()
+	  profile = wrapper.get_profile('googlebuzz')
+	  self.assertTrue(profile is not None)
+	  
+	  profile = wrapper.get_profile(user_id = 'adewale')
+	  self.assertTrue(profile is not None)
+
+if __name__ == '__main__':
+  unittest.main()
\ No newline at end of file
