diff --git a/.coveragerc b/.coveragerc
index fac7edfa42b..c6bf3d197ae 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -235,6 +235,7 @@ omit =
     homeassistant/components/light/zengge.py
     homeassistant/components/lirc.py
     homeassistant/components/lock/nuki.py
+    homeassistant/components/lock/lockitron.py
     homeassistant/components/media_player/anthemav.py
     homeassistant/components/media_player/apple_tv.py
     homeassistant/components/media_player/aquostv.py
diff --git a/homeassistant/components/lock/lockitron.py b/homeassistant/components/lock/lockitron.py
new file mode 100644
index 00000000000..86821711fd2
--- /dev/null
+++ b/homeassistant/components/lock/lockitron.py
@@ -0,0 +1,92 @@
+"""
+Lockitron lock platform.
+
+For more details about this platform, please refer to the documentation
+https://home-assistant.io/components/lockitron/
+"""
+import logging
+
+import requests
+import voluptuous as vol
+
+import homeassistant.helpers.config_validation as cv
+from homeassistant.components.lock import LockDevice, PLATFORM_SCHEMA
+from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ID
+
+_LOGGER = logging.getLogger(__name__)
+
+DOMAIN = 'lockitron'
+
+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
+    vol.Required(CONF_ACCESS_TOKEN): cv.string,
+    vol.Required(CONF_ID): cv.string
+})
+BASE_URL = 'https://api.lockitron.com'
+API_STATE_URL = BASE_URL + '/v2/locks/{}?access_token={}'
+API_ACTION_URL = BASE_URL + '/v2/locks/{}?access_token={}&state={}'
+
+
+# pylint: disable=unused-argument
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """Setup the Lockitron platform."""
+    access_token = config.get(CONF_ACCESS_TOKEN)
+    device_id = config.get(CONF_ID)
+    response = requests.get(API_STATE_URL.format(device_id, access_token))
+    if response.status_code == 200:
+        add_devices([Lockitron(response.json()['state'], access_token,
+                               device_id)])
+    else:
+        _LOGGER.error('Error retrieving lock status during init: %s',
+                      response.text)
+
+
+class Lockitron(LockDevice):
+    """Representation of a Lockitron lock."""
+
+    LOCK_STATE = 'lock'
+    UNLOCK_STATE = 'unlock'
+
+    def __init__(self, state, access_token, device_id):
+        """Initialize the lock."""
+        self._state = state
+        self.access_token = access_token
+        self.device_id = device_id
+
+    @property
+    def name(self):
+        """Return the name of the device."""
+        return DOMAIN
+
+    @property
+    def is_locked(self):
+        """Return True if the lock is currently locked, else False."""
+        return self._state == Lockitron.LOCK_STATE
+
+    def lock(self, **kwargs):
+        """Lock the device."""
+        self._state = self.do_change_request(Lockitron.LOCK_STATE)
+
+    def unlock(self, **kwargs):
+        """Unlock the device."""
+        self._state = self.do_change_request(Lockitron.UNLOCK_STATE)
+
+    def update(self):
+        """Update the internal state of the device."""
+        response = requests \
+            .get(API_STATE_URL.format(self.device_id, self.access_token))
+        if response.status_code == 200:
+            self._state = response.json()['state']
+        else:
+            _LOGGER.error('Error retrieving lock status: %s', response.text)
+
+    def do_change_request(self, requested_state):
+        """Execute the change request and pull out the new state."""
+        response = requests.put(
+            API_ACTION_URL.format(self.device_id, self.access_token,
+                                  requested_state))
+        if response.status_code == 200:
+            return response.json()['state']
+        else:
+            _LOGGER.error('Error setting lock state: %s\n%s',
+                          requested_state, response.text)
+            return self._state