diff --git a/cod_session/cod_session.admin.inc b/cod_session/cod_session.admin.inc
new file mode 100644
index 0000000..12f2d2e
--- /dev/null
+++ b/cod_session/cod_session.admin.inc
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the cod_session module.
+ */
+
+/**
+ * Form constructor for the COD session room form.
+ */
+function cod_session_room_form($form, &$form_state, CodSessionRoom $cod_session_room) {
+  $form['title'] = array(
+    '#title' => t('Label'),
+    '#type' => 'textfield',
+    '#default_value' => $cod_session_room->title,
+    '#description' => t('The human-readable name of this room.'),
+    '#required' => TRUE,
+    '#size' => 30,
+  );
+  $form['name'] = array(
+    '#type' => 'machine_name',
+    '#default_value' => isset($cod_session_room->name) ? $cod_session_room->name : '',
+    '#maxlength' => 32,
+    '#disabled' => $cod_session_room->identifier(),
+    '#machine_name' => array(
+      'exists' => 'cod_session_get_rooms',
+      'source' => array('title'),
+    ),
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save room'),
+    '#weight' => 40,
+  );
+  return $form;
+}
diff --git a/cod_session/cod_session.entity.inc b/cod_session/cod_session.entity.inc
new file mode 100644
index 0000000..003cc51
--- /dev/null
+++ b/cod_session/cod_session.entity.inc
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @file
+ * Entity related functions for the COD session module.
+ */
+
+/**
+ * Provides an entity class for session rooms.
+ */
+class CodSessionRoom extends Entity {
+
+  /**
+   * @var string
+   */
+  public $title;
+
+}
diff --git a/cod_session/cod_session.info b/cod_session/cod_session.info
index 232c167..6640039 100644
--- a/cod_session/cod_session.info
+++ b/cod_session/cod_session.info
@@ -186,3 +186,4 @@ features[views_view][] = cod_session_sessions_speaker_confirmation
 features[views_view][] = cod_session_time_slots
 features[views_view][] = cod_session_timeslot
 files[] = cod_session_views_style_plugin_schedule.inc
+files[] = cod_session.entity.inc
diff --git a/cod_session/cod_session.install b/cod_session/cod_session.install
new file mode 100644
index 0000000..2be06fc
--- /dev/null
+++ b/cod_session/cod_session.install
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Installation functions for cod_session.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function cod_session_schema() {
+  $schema = array();
+  $schema['cod_session_room'] = array(
+    'description' => '@todo.',
+    'fields' => array(
+      'csrid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique block ID.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => '@todo',
+        'translatable' => TRUE,
+      ),
+    ),
+    'primary key' => array('csrid'),
+  );
+  return $schema;
+}
diff --git a/cod_session/cod_session.module b/cod_session/cod_session.module
index 118b122..f4f6879 100644
--- a/cod_session/cod_session.module
+++ b/cod_session/cod_session.module
@@ -568,4 +568,72 @@ function cod_session_custom_theme() {
     drupal_add_css($path . '/css/sign-style.css');
     return 'seven';
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Implements hook_entity_info().
+ */
+function cod_session_entity_info() {
+  $entities['cod_session_room'] = array(
+    'label' => t('Room'),
+    'label callback' => 'entity_class_label',
+    'uri callback' => 'entity_class_uri',
+    'entity class' => 'CodSessionRoom',
+    'controller class' => 'EntityAPIController',
+    'base table' => 'cod_session_room',
+    'fieldable' => TRUE,
+    'redirect' => FALSE,
+    'entity keys' => array(
+      'id' => 'csrid',
+      'label' => 'title',
+    ),
+    'module' => 'cod_session',
+    'view modes' => array(
+      'default' => array(
+        'label' => 'Default',
+        'custom settings' => TRUE,
+      ),
+    ),
+    'access callback' => 'cod_session_room_access',
+    'bundles'=> array(
+      'room' => array(
+        'label' => t('Room'),
+        'admin' => array(
+          'path' => 'admin/conference/rooms/%room',
+          'real path' => 'admin/conference/rooms/room',
+          'bundle argument' => 3,
+          'access arguments' => array('administer rooms'),
+        ),
+      ),
+    ),
+    'static cache' => TRUE,
+    'field cache' => TRUE,
+    'admin ui' => array(
+      'path' => 'admin/conference/rooms',
+      'file' => 'cod_session.admin.inc',
+      'file path' => drupal_get_path('module', 'cod_session'),
+      'controller class' => 'EntityDefaultUIController',
+    ),
+  );
+
+  return $entities;
+}
+
+/**
+ * Access callback for session rooms.
+ */
+function cod_session_room_access() {
+  // @todo.
+  return TRUE;
+}
+
+/**
+ * Gets an array of all rooms, keyed by the name.
+ *
+ * @param string|null $name
+ *   (optional) If set, the room with the given name is returned.
+ */
+function cod_session_get_rooms($name = NULL) {
+  $rooms = entity_load_multiple_by_name('cod_session_room', isset($name) ? array($name) : FALSE);
+  return isset($name) ? reset($rooms) : $rooms;
+}
