diff --git a/app/components/contributor-list/component.js b/app/components/contributor-list/component.js
new file mode 100644
index 0000000..f515211
--- /dev/null
+++ b/app/components/contributor-list/component.js
@@ -0,0 +1,8 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+
+ tagName: 'table',
+ classNames: 'contributor-list'
+
+});
diff --git a/app/components/contributor-list/template.hbs b/app/components/contributor-list/template.hbs
new file mode 100644
index 0000000..fad203d
--- /dev/null
+++ b/app/components/contributor-list/template.hbs
@@ -0,0 +1,14 @@
+
+
+
+ {{contributor-list contributors=model.contributors}}
+
+
diff --git a/tests/integration/components/contributor-list/component-test.js b/tests/integration/components/contributor-list/component-test.js
new file mode 100644
index 0000000..298042c
--- /dev/null
+++ b/tests/integration/components/contributor-list/component-test.js
@@ -0,0 +1,16 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('contributor-list', 'Integration | Component | contributor list', {
+ integration: true
+});
+
+test('it renders', function(assert) {
+
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.on('myAction', function(val) { ... });
+
+ this.render(hbs`{{contributor-list}}`);
+
+ assert.equal(this.$().text().trim(), '');
+});
diff --git a/tests/unit/models/contributor-test.js b/tests/unit/models/contributor-test.js
new file mode 100644
index 0000000..2a7dbe4
--- /dev/null
+++ b/tests/unit/models/contributor-test.js
@@ -0,0 +1,9 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('model:contributor', 'Unit | Model | contributor');
+
+test('avatarURL returns correct URL', function(assert) {
+ let model = this.subject();
+ model.set('github_uid', '318');
+ assert.equal(model.get('avatarURL'), 'https://avatars2.githubusercontent.com/u/318?v=3&s=128');
+});