diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 1d86e02..6ffd5d7 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -15,188 +15,57 @@
 class EntityType implements EntityTypeInterface {
 
   /**
-   * Indicates whether entities should be statically cached.
-   *
-   * @var bool
-   */
-  protected $static_cache;
-
-  /**
-   * Indicates whether the rendered output of entities should be cached.
-   *
-   * @var bool
-   */
-  protected $render_cache;
-
-  /**
-   * Indicates if the persistent cache of field data should be used.
-   *
-   * @var bool
-   */
-  protected $field_cache;
-
-  /**
-   * An array of entity keys.
-   *
-   * @var array
-   */
-  protected $entity_keys = array();
-
-  /**
-   * The unique identifier of this entity type.
-   *
-   * @var string
-   */
-  protected $id;
-
-  /**
-   * The name of the provider of this entity type.
-   *
-   * @var string
-   */
-  protected $provider;
-
-  /**
-   * The name of the entity type class.
-   *
-   * @var string
-   */
-  protected $class;
-
-  /**
-   * An array of controllers.
-   *
-   * @var array
-   */
-  protected $controllers = array();
-
-  /**
-   * The name of the default administrative permission.
-   *
-   * @var string
-   */
-  protected $admin_permission;
-
-  /**
-   * The permission granularity level.
-   *
-   * The allowed values are respectively "entity_type", "bundle" or FALSE.
-   *
-   * @var string|bool
-   */
-  protected $permission_granularity;
-
-  /**
-   * An array describing how the Field API can extract the information it needs
-   * from the bundle objects for this type (e.g Vocabulary objects for terms;
-   * not applicable for nodes):
-   * - bundle: The name of the property that contains the name of the bundle
-   *   object.
-   *
-   * This entry can be omitted if this type's bundles do not exist as standalone
-   * objects.
-   *
-   * @var array
-   */
-  protected $bundle_keys = array();
-
-  /**
-   * Indicates whether fields can be attached to entities of this type.
-   *
-   * @var bool (optional)
-   */
-  protected $fieldable;
-
-  /**
-   * Link templates using the URI template syntax.
+   * An array of entity type definition data. Containing the following keys:
+   *   - 'static_cache': (bool) Indicates whether entities should be statically
+   *     cached.
+   *   - 'render_cache': (bool) Indicates whether the rendered output of
+   *     entities should be cached.
+   *   - 'field_cache': (bool) Indicates if the persistent cache of field data
+   *     should be used.
+   *   - 'entity_keys': (array) An array of entity keys.
+   *   - 'id': (int|string) The unique identifier of this entity type.
+   *   - 'provider': (string) The name of the provider of this entity type.
+   *   - 'class': (string) The name of the entity type class.
+   *   - 'controllers': (array) An array of controllers.
+   *   - 'admin_permission': (string) The name of the default administrative
+   *     permission.
+   *   - 'permission_granularity': (string|bool) The allowed values are
+   *     respectively "entity_type", "bundle" or FALSE.
+   *   - 'bundle_keys': (array) An array describing how the Field API can
+   *     extract the information it needs from the bundle objects for this type
+   *     (e.g Vocabulary objects for terms; not applicable for nodes):
+   *       - bundle: The name of the property that contains the name of the
+   *         bundle object.
+   *     This entry can be omitted if this type's bundles do not exist as
+   *     standalone objects.
+   *   - 'fieldable': (bool) Indicates whether fields can be attached to
+   *     entities of this type.
+   *   - 'links': (array) Link templates using the URI template syntax.
+   *   - 'label_callback': (string) The name of a callback that returns the
+   *     label of the entity.
+   *   - 'bundle_entity_type': (string) The name of the entity type which
+   *     provides bundles.
+   *   - 'bundle_of': (string) The name of the entity type for which bundles are
+   *     provided.
+   *   - 'bundle_label': (string) The human-readable name of the entity bundles,
+   *     e.g. Vocabulary.
+   *   - 'base_table': (string) The name of the entity type's base table.
+   *   - 'revision_data_table': (string) The name of the entity type's revision
+   *     data table.
+   *   - 'revision_table': (string) The name of the entity type's revision
+   *     table.
+   *   - 'data_table': (string) The name of the entity type's data table.
+   *   - 'translatable': (bool) Indicates whether entities of this type have
+   *     multilingual support.
+   *   - 'config_prefix': (string) The config prefix used by the configuration
+   *     entity type.
+   *   - 'label': (string) The human-readable name of the type.
+   *   - 'uri_callback': (callable) A callable that can be used to provide the
+   *     entity URI.
    *
    * @var array
    */
-  protected $links = array();
-
-  /**
-   * The name of a callback that returns the label of the entity.
-   *
-   * @var string
-   */
-  protected $label_callback;
-
-  /**
-   * The name of the entity type which provides bundles.
-   *
-   * @var string
-   */
-  protected $bundle_entity_type;
-
-  /**
-   * The name of the entity type for which bundles are provided.
-   *
-   * @var string
-   */
-  protected $bundle_of;
-
-  /**
-   * The human-readable name of the entity bundles, e.g. Vocabulary.
-   *
-   * @var string
-   */
-  protected $bundle_label;
-
-  /**
-   * The name of the entity type's base table.
-   *
-   * @var string
-   */
-  protected $base_table;
-
-  /**
-   * The name of the entity type's revision data table.
-   *
-   * @var string
-   */
-  protected $revision_data_table;
-
-  /**
-   * The name of the entity type's revision table.
-   *
-   * @var string
-   */
-  protected $revision_table;
-
-  /**
-   * The name of the entity type's data table.
-   *
-   * @var string
-   */
-  protected $data_table;
-
-  /**
-   * Indicates whether entities of this type have multilingual support.
-   *
-   * @var bool
-   */
-  protected $translatable = FALSE;
-
-  /**
-   * Returns the config prefix used by the configuration entity type.
-   *
-   * @var string
-   */
-  protected $config_prefix;
-
-  /**
-   * The human-readable name of the type.
-   *
-   * @var string
-   */
-  protected $label;
-
-  /**
-   * A callable that can be used to provide the entity URI.
-   *
-   * @var callable
-   */
-  protected $uri_callback;
+  protected $definition;
 
   /**
    * Constructs a new EntityType.
@@ -205,23 +74,21 @@ class EntityType implements EntityTypeInterface {
    *   An array of values from the annotation.
    */
   public function __construct($definition) {
-    foreach ($definition as $property => $value) {
-      $this->{$property} = $value;
-    }
+    $this->definition = $definition;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function get($property) {
-    return isset($this->{$property}) ? $this->{$property} : NULL;
+  public function get($property, $default = NULL) {
+    return isset($this->definition[$property]) ? $this->definition[$property] : $default;
   }
 
   /**
    * {@inheritdoc}
    */
   public function set($property, $value) {
-    $this->{$property} = $value;
+    $this->definition[$property] = $value;
     return $this;
   }
 
@@ -229,28 +96,28 @@ public function set($property, $value) {
    * {@inheritdoc}
    */
   public function isStaticallyCacheable() {
-    return isset($this->static_cache) ? $this->static_cache: TRUE;
+    return $this->get('static_cache', TRUE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function isRenderCacheable() {
-    return isset($this->render_cache) ? $this->render_cache: TRUE;
+    return $this->get('render_cache', TRUE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function isFieldDataCacheable() {
-    return isset($this->field_cache) ? $this->field_cache: TRUE;
+    return $this->get('field_cache', TRUE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getKeys() {
-    return $this->entity_keys + array('revision' => '', 'bundle' => '');
+    return $this->get('entity_keys', array()) + array('revision' => '', 'bundle' => '');
   }
 
   /**
@@ -273,28 +140,28 @@ public function hasKey($key) {
    * {@inheritdoc}
    */
   public function id() {
-    return $this->id;
+    return $this->get('id');
   }
 
   /**
    * {@inheritdoc}
    */
   public function getProvider() {
-    return $this->provider;
+    return $this->get('provider');
   }
 
   /**
    * {@inheritdoc}
    */
   public function getClass() {
-    return $this->class;
+    return $this->get('class');
   }
 
   /**
    * {@inheritdoc}
    */
   public function setClass($class) {
-    $this->class = $class;
+    $this->set('class', $class);
     return $this;
   }
 
@@ -309,7 +176,7 @@ public function isSubclassOf($class) {
    * {@inheritdoc}
    */
   public function getControllers() {
-    return $this->controllers + array(
+    return $this->get('controllers', array()) + array(
       'access' => 'Drupal\Core\Entity\EntityAccessController',
     );
   }
@@ -326,7 +193,9 @@ public function getController($controller_type) {
    * {@inheritdoc}
    */
   public function setController($controller_type, $value) {
-    $this->controllers[$controller_type] = $value;
+    $controllers = $this->getControllers();
+    $controllers[$controller_type] = $value;
+    $this->set('controllers', $controllers);
     return $this;
   }
 
@@ -342,7 +211,9 @@ public function hasController($controller_type) {
    * {@inheritdoc}
    */
   public function setForm($operation, $class) {
-    $this->controllers['form'][$operation] = $class;
+    $controllers = $this->getControllers();
+    $controllers['form'][$operation] = $class;
+    $this->set('controllers', $controllers);
     return $this;
   }
 
@@ -350,7 +221,7 @@ public function setForm($operation, $class) {
    * {@inheritdoc}
    */
   public function setList($class) {
-    $this->controllers['list'] = $class;
+    $this->setController('list', $class);
     return $this;
   }
 
@@ -358,42 +229,43 @@ public function setList($class) {
    * {@inheritdoc}
    */
   public function getAdminPermission() {
-    return $this->admin_permission ?: FALSE;
+    return $this->get('admin_permission', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getPermissionGranularity() {
-    return isset($this->permission_granularity) ? $this->permission_granularity : 'entity_type';
+    return $this->get('permission_granularity', 'entity_type');
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleKeys() {
-    return isset($this->bundle_keys) ? $this->bundle_keys : array();
+    return $this->get('bundle_keys', array());
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleKey($name) {
-    return isset($this->bundle_keys[$name]) ? $this->bundle_keys[$name] : FALSE;
+    $bundle_keys = $this->getBundleKeys();
+    return isset($bundle_keys[$name]) ? $bundle_keys[$name] : FALSE;
   }
 
   /**
    * {@inheritdoc}
    */
   public function isFieldable() {
-    return isset($this->fieldable) ? $this->fieldable : FALSE;
+    return $this->get('fieldable', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getLinkTemplates() {
-    return isset($this->links) ? $this->links : array();
+    return $this->get('links', array());
   }
 
   /**
@@ -416,7 +288,9 @@ public function hasLinkTemplate($key) {
    * {@inheritdoc}
    */
   public function setLinkTemplate($key, $route_name) {
-    $this->links[$key] = $route_name;
+    $links = $this->getLinkTemplates();
+    $links[$key] = $route_name;
+    $this->set('links', $links);
     return $this;
   }
 
@@ -424,14 +298,14 @@ public function setLinkTemplate($key, $route_name) {
    * {@inheritdoc}
    */
   public function getLabelCallback() {
-    return isset($this->label_callback) ? $this->label_callback : FALSE;
+    return $this->get('label_callback', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function setLabelCallback($callback) {
-    $this->label_callback = $callback;
+    $this->set('label_callback', $callback);
     return $this;
   }
 
@@ -439,77 +313,77 @@ public function setLabelCallback($callback) {
    * {@inheritdoc}
    */
   public function hasLabelCallback() {
-    return isset($this->label_callback);
+    return (bool) $this->get('label_callback', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleEntityType() {
-    return isset($this->bundle_entity_type) ? $this->bundle_entity_type : 'bundle';
+    return $this->get('bundle_entity_type', 'bundle');
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleOf() {
-    return isset($this->bundle_of) ? $this->bundle_of : FALSE;
+    return $this->get('bundle_of', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBundleLabel() {
-    return isset($this->bundle_label) ? $this->bundle_label : FALSE;
+    return $this->get('bundle_label', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getBaseTable() {
-    return isset($this->base_table) ? $this->base_table : FALSE;
+    return $this->get('base_table', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function isTranslatable() {
-    return !empty($this->translatable);
+    return $this->get('translatable', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getConfigPrefix() {
-    return isset($this->config_prefix) ? $this->config_prefix : FALSE;
+    return $this->get('config_prefix', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getRevisionDataTable() {
-    return isset($this->revision_data_table) ? $this->revision_data_table : FALSE;
+    return $this->get('revision_data_table', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getRevisionTable() {
-    return isset($this->revision_table) ? $this->revision_table : FALSE;
+    return $this->get('revision_table', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getDataTable() {
-    return isset($this->data_table) ? $this->data_table : FALSE;
+    return $this->get('data_table', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getLabel() {
-    return isset($this->label) ? $this->label : '';
+    return $this->get('label', '');
   }
 
   /**
@@ -523,14 +397,14 @@ public function getLowercaseLabel() {
    * {@inheritdoc}
    */
   public function getUriCallback() {
-    return isset($this->uri_callback) ? $this->uri_callback : FALSE;
+    return $this->get('uri_callback', FALSE);
   }
 
   /**
    * {@inheritdoc}
    */
   public function setUriCallback($callback) {
-    $this->uri_callback = $callback;
+    $this->set('uri_callback', $callback);
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
index 4cb05aa..2f4f718 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -22,11 +22,14 @@
    *
    * @param string $property
    *   The property to retrieve.
+   * @param mixed $default
+   *   The default value to return if the specified property is not present.
    *
    * @return mixed
-   *   The value for that property, or NULL if the property does not exist.
+   *   The value for that property, or the default value if the property does
+   *   not exist (defaults to NULL).
    */
-  public function get($property);
+  public function get($property, $default = NULL);
 
   /**
    * Sets a value to an arbitrary property.
