diff --git a/.travis.yml b/.travis.yml
index f8d9b4ccffbf43047d56cf514fadac92e6ac2b35..f89e09380cf2ac3f66fb9d3f8f7253cd4db83d4a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,13 +9,10 @@ env:
         - VBOX_MEMORY=2048
         - VBOX_HWVIRTEX=off
     matrix:
-        - TOXENV=openbsd60
         - TOXENV=xenial
         - TOXENV=trusty
-        - TOXENV=precise
         - &stretch TOXENV=stretch
         - &jessie TOXENV=jessie
-        - TOXENV=wheezy
 
 cache:
   - pip
diff --git a/README.rst b/README.rst
index d50fb09c8eb2981fc3817e27116a87b161505707..f3ecfc6d27aaf6ed0241ffce7050bc96f702e94d 100644
--- a/README.rst
+++ b/README.rst
@@ -1,12 +1,10 @@
-Example
+Node.js
 #######
 
-.. image:: https://travis-ci.org/adarnimrod/example.svg?branch=master
-    :target: https://travis-ci.org/adarnimrod/example
+.. image:: https://travis-ci.org/adarnimrod/nodejs.svg?branch=master
+    :target: https://travis-ci.org/adarnimrod/nodejs
 
-An (empty) example Ansible role complete with working tests out of the box. For
-more information read the `blog post
-<https://www.shore.co.il/blog/ansible-example-role/>`_.
+Install Node.js on Debian or Ubuntu from packages in NodeSource' repository.
 
 Requirements
 ------------
diff --git a/defaults/main.yml b/defaults/main.yml
index 0a97962c3b635cf908e8e45d5171b0aa8b7f3d92..a5a99749bd275d9fa68285b47129b153b7672827 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -1,2 +1,4 @@
 ---
-# defaults file for example
+# defaults file for nodejs
+
+nodejs_version: 8 # or 6.
diff --git a/handlers/main.yml b/handlers/main.yml
index bd0df0d80d6094e097cca7760cd1b12a480df33c..7c65bbdbceea5e7522a1a41a9ef8d2fd9843a1ee 100644
--- a/handlers/main.yml
+++ b/handlers/main.yml
@@ -1,2 +1,2 @@
 ---
-# handlers file for example
+# handlers file for nodejs
diff --git a/meta/main.yml b/meta/main.yml
index d768011e6d12fce30f080f03ab7b77ba904b9936..e3c47eda36e55e0ee62082114608afddb15976e3 100644
--- a/meta/main.yml
+++ b/meta/main.yml
@@ -1,22 +1,17 @@
 galaxy_info:
   author: Nimrod Adar
-  description: An example Ansible role
+  description: Install Node.js on Debian or Ubuntu from packages in NodeSource' repository
   company: Shore technologies
   license: MIT
   min_ansible_version: 2.3
   platforms:
-  - name: OpenBSD
-    versions:
-    - 6.0
   - name: Ubuntu
     versions:
     - xenial
     - trusty
-    - precise
   - name: Debian
     versions:
     - stretch
     - jessie
-    - wheezy
-  galaxy_tags: [ ansible ]
+  galaxy_tags: [ nodejs ]
 dependencies: []
diff --git a/molecule.yml b/molecule.yml
index 013e6c74fae3489b9dbc47190b543b6c24140577..81f9e3cc0927fded6f1af2b1fc71db1a0c732c68 100644
--- a/molecule.yml
+++ b/molecule.yml
@@ -35,7 +35,7 @@ vagrant:
   - name: wheezy
     box: bmorg/debian-wheezy-i386
   instances:
-  - name: example
+  - name: nodejs
     options:
         append_platform_to_hostname: yes
   raw_config_args:
diff --git a/tasks/main.yml b/tasks/main.yml
index 0ab13c50f3aa88dc431f5b1d4f26744bb1db3bf9..d522eed98dce07ec04f969cfe2aade9312537762 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -1,8 +1,35 @@
 ---
-# tasks file for example
+# tasks file for nodejs
 
 - name: Assertions
   assert:
     that:
-        - ansible_os_family in ['OpenBSD', 'Debian']
-        - ansible_distribution_release in ['xenial', 'trusty', 'precise', 'stretch', 'jessie', 'wheezy'] or ansible_distribution_version in ['6.0']
+        - ansible_os_family == 'Debian'
+        - ansible_lsb.codename in ['buster', 'jessie', 'sid', 'stretch', 'trusty', 'xenial', 'yakkety', 'zesty']
+        - nodejs_version in [6, 8]
+
+- name: APT install prerequisites
+  apt:
+      name: apt-transport-https
+      state: present
+      update_cache: True
+      cache_valid_time: 3600
+
+- name: Add APT repository key
+  apt_key:
+      url: https://deb.nodesource.com/gpgkey/nodesource.gpg.key
+      state: present
+
+- name: Add APT repository
+  apt_repository:
+      repo: |
+          deb https://deb.nodesource.com/node_{{ nodejs_version }}.x {{ ansible_lsb.codename }} main
+      state: present
+      update_cache: True
+
+- name: APT install
+  apt:
+      name: nodejs
+      state: present
+      update_cache: True
+      cache_valid_time: 3600
diff --git a/tests/playbook.yml b/tests/playbook.yml
index 55444f3e9d597410c72104be8cd4b99151243a5a..dcc12fb3158195d903e7455dd88e6ab16383a092 100644
--- a/tests/playbook.yml
+++ b/tests/playbook.yml
@@ -1,5 +1,5 @@
 ---
-- hosts: example-openbsd*
+- hosts: nodejs-openbsd*
   gather_facts: false
   roles:
       - openbsd-bootstrap
@@ -8,7 +8,7 @@
         users_use_sudo: True
         users_lock_root_ssh: False
 
-- hosts: [example-xenial, example-wheezy]
+- hosts: [nodejs-xenial, nodejs-wheezy]
   gather_facts: false
   roles:
       - debian-bootstrap
@@ -19,4 +19,4 @@
 
 - hosts: all
   roles:
-    - role: example
+    - role: nodejs
diff --git a/tests/test_nodejs.py b/tests/test_nodejs.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b83ec7822930aacd4d7d75e9cd8086b09cbbe4d
--- /dev/null
+++ b/tests/test_nodejs.py
@@ -0,0 +1,12 @@
+from testinfra.utils.ansible_runner import AnsibleRunner
+
+testinfra_hosts = AnsibleRunner('.molecule/ansible_inventory').get_hosts('all')
+
+
+def test_nodejs(host):
+    assert host.run('node --version').rc == 0
+    assert host.run('nodejs --version').rc == 0
+
+
+def test_root(host):
+    assert host.run('npm --version').rc == 0
diff --git a/tox.ini b/tox.ini
index c80d480b6f557c37a14f6ec977a2900494e95d51..2209e501c441b08f025b10dffdd4426594724969 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,7 +1,7 @@
 [tox]
 skip_install = True
 skipsdist = True
-envlist = openbsd60,xenial,trusty,precise,stretch,jessie,wheezy
+envlist = xenial,trusty,stretch,jessie
 
 [testenv]
 envdir = {toxinidir}/.tox/molecule
diff --git a/vars/main.yml b/vars/main.yml
index 7542f3cf45dd754b408bd13b5c57af85bc3d0fc8..6422ced18a1ca12c4ffcd530e6e140ea5bad0f36 100644
--- a/vars/main.yml
+++ b/vars/main.yml
@@ -1,2 +1,2 @@
 ---
-# vars file for example
+# vars file for nodejs