diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index f7a908a..e1e3e18 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -281,7 +281,7 @@ function aggregator_cron() {
     $feed = aggregator_feed_load($fid);
     if ($queue->createItem($feed)) {
       // Add timestamp to avoid queueing item more than once.
-      $feed->queued->value = REQUEST_TIME;
+      $feed->setQueued(REQUEST_TIME);
       $feed->save();
     }
   }
@@ -365,7 +365,7 @@ function aggregator_save_category($edit) {
  */
 function aggregator_refresh(Feed $feed) {
   // Store feed URL to track changes.
-  $feed_url = $feed->url->value;
+  $feed_url = $feed->getUrl();
 
   $config = config('aggregator.settings');
   // Fetch the feed.
@@ -396,21 +396,21 @@ function aggregator_refresh(Feed $feed) {
   // data. If both are equal we say that feed is not updated.
   $hash = hash('sha256', $feed->source_string);
 
-  if ($success && ($feed->hash->value != $hash)) {
+  if ($success && ($feed->getHash() != $hash)) {
     // Parse the feed.
     $parser_manager = Drupal::service('plugin.manager.aggregator.parser');
     try {
       if ($parser_manager->createInstance($config->get('parser'))->parse($feed)) {
-        if (empty($feed->link->value)) {
-          $feed->link->value = $feed->url->value;
+        if (is_null($feed->getLink())) {
+          $feed->setLink($feed->getUrl());
         }
-        $feed->hash->value = $hash;
+        $feed->setHash($hash);
         // Update feed with parsed data.
         $feed->save();
 
         // Log if feed URL has changed.
-        if ($feed->url->value != $feed_url) {
-          watchdog('aggregator', 'Updated URL for feed %title to %url.', array('%title' => $feed->label(), '%url' => $feed->url->value));
+        if ($feed->getUrl() != $feed_url) {
+          watchdog('aggregator', 'Updated URL for feed %title to %url.', array('%title' => $feed->label(), '%url' => $feed->getUrl()));
         }
 
         watchdog('aggregator', 'There is new syndicated content from %site.', array('%site' => $feed->label()));
@@ -433,8 +433,8 @@ function aggregator_refresh(Feed $feed) {
   }
 
   // Regardless of successful or not, indicate that this feed has been checked.
-  $feed->checked->value = REQUEST_TIME;
-  $feed->queued->value = 0;
+  $feed->setChecked(REQUEST_TIME);
+  $feed->setQueued(0);
   $feed->save();
 
   // Processing is done, call postProcess on enabled processors.
diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index c524505..13c89b5 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -524,27 +524,27 @@ function template_preprocess_aggregator_feed_source(&$variables) {
 
   $feed_icon = array(
     '#theme' => 'feed_icon',
-    '#url' => $feed->url->value,
+    '#url' => $feed->getUrl(),
     '#title' => t('!title feed', array('!title' => $feed->label())),
   );
   $variables['source_icon'] = drupal_render($feed_icon);
 
-  if (!empty($feed->image->value) && $feed->label() && !empty($feed->link->value)) {
+  if (!is_null($feed->getImage()) && $feed->label() && !is_null($feed->getLink())) {
     $image = array(
       '#theme' => 'image',
-      '#path' => $feed->image->value,
-      '#alt' => $feed->title->value,
+      '#path' => $feed->getImage(),
+      '#alt' => $feed->label(),
     );
-    $variables['source_image'] = l($image, $feed->link->value, array('html' => TRUE, 'attributes' => array('class' => 'feed-image')));
+    $variables['source_image'] = l($image, $feed->getLink(), array('html' => TRUE, 'attributes' => array('class' => 'feed-image')));
   }
   else {
     $variables['source_image'] = '';
   }
-  $variables['source_description'] = aggregator_filter_xss($feed->description->value);
-  $variables['source_url'] = check_url(url($feed->link->value, array('absolute' => TRUE)));
+  $variables['source_description'] = aggregator_filter_xss($feed->getDescription());
+  $variables['source_url'] = check_url(url($feed->getLink(), array('absolute' => TRUE)));
 
   if ($feed->checked) {
-    $variables['last_checked'] = t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->checked->value)));
+    $variables['last_checked'] = t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->getChecked())));
   }
   else {
     $variables['last_checked'] = t('never');
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
index a8b1d80..2c5bace 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Controller/AggregatorController.php
@@ -145,33 +145,32 @@ public function feedRefresh(FeedInterface $aggregator_feed, Request $request) {
    *   A render array as expected by drupal_render().
    */
   public function adminOverview() {
-    $result = $this->database->query('SELECT f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, f.block, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, f.block ORDER BY f.title');
-
+    $feeds = $this->entityManager->getStorageController('aggregator_feed')->loadMultiple();
     $header = array(t('Title'), t('Items'), t('Last update'), t('Next update'), t('Operations'));
     $rows = array();
-    foreach ($result as $feed) {
+    foreach ($feeds as $feed) {
       $row = array();
-      $row[] = l($feed->title, "aggregator/sources/$feed->fid");
+      $row[] = l($feed->label(), "aggregator/sources/{$feed->id()}");
       $row[] = format_plural($feed->items, '1 item', '@count items');
-      $row[] = ($feed->checked ? t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->checked))) : t('never'));
-      $row[] = ($feed->checked && $feed->refresh ? t('%time left', array('%time' => format_interval($feed->checked + $feed->refresh - REQUEST_TIME))) : t('never'));
+      $row[] = ($feed->getChecked ? t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->getChecked()))) : t('never'));
+      $row[] = ($feed->getChecked() && $feed->getRefresh() ? t('%time left', array('%time' => format_interval($feed->getChecked() + $feed->getRefresh() - REQUEST_TIME))) : t('never'));
       $links = array();
       $links['edit'] = array(
         'title' => t('Edit'),
-        'href' => "admin/config/services/aggregator/edit/feed/$feed->fid",
+        'href' => "admin/config/services/aggregator/edit/feed/{$feed->id()}",
       );
       $links['delete'] = array(
         'title' => t('Delete'),
-        'href' => "admin/config/services/aggregator/delete/feed/$feed->fid",
+        'href' => "admin/config/services/aggregator/delete/feed/{$feed->id()}",
       );
       $links['remove'] = array(
         'title' => t('Remove items'),
-        'href' => "admin/config/services/aggregator/remove/$feed->fid",
+        'href' => "admin/config/services/aggregator/remove/{$feed->id()}",
       );
       $links['update'] = array(
         'title' => t('Update items'),
-        'href' => "admin/config/services/aggregator/update/$feed->fid",
-        'query' => array('token' => drupal_get_token("aggregator/update/$feed->fid")),
+        'href' => "admin/config/services/aggregator/update/{$feed->id()}",
+        'query' => array('token' => drupal_get_token("aggregator/update/{$feed->id()}")),
       );
       $row[] = array(
         'data' => array(
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
index ef25376..b13205a 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php
@@ -35,27 +35,27 @@ public function form(array $form, array &$form_state) {
     $form['langcode'] = array(
       '#title' => t('Language'),
       '#type' => 'language_select',
-      '#default_value' => $feed->language()->id,
+      '#default_value' => $feed->getLangcode(),
       '#languages' => Language::STATE_ALL,
     );
 
     $form['url'] = array(
       '#type' => 'url',
       '#title' => t('URL'),
-      '#default_value' => $feed->url->value,
+      '#default_value' => $feed->getUrl(),
       '#maxlength' => NULL,
       '#description' => t('The fully-qualified URL of the feed.'),
       '#required' => TRUE,
     );
     $form['refresh'] = array('#type' => 'select',
       '#title' => t('Update interval'),
-      '#default_value' => $feed->refresh->value,
+      '#default_value' => $feed->getRefresh(),
       '#options' => $period,
       '#description' => t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
     );
     $form['block'] = array('#type' => 'select',
       '#title' => t('News items in block'),
-      '#default_value' => $feed->block->value,
+      '#default_value' => $feed->getBlock(),
       '#options' => drupal_map_assoc(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)),
       '#description' => t("Drupal can make a block with the most recent news items of this feed. You can <a href=\"@block-admin\">configure blocks</a> to be displayed in the sidebar of your page. This setting lets you configure the number of news items to show in this feed's block. If you choose '0' this feed's block will be disabled.", array('@block-admin' => url('admin/structure/block'))),
     );
@@ -91,18 +91,18 @@ public function validate(array $form, array &$form_state) {
     $feed = $this->buildEntity($form, $form_state);
     // Check for duplicate titles.
     if ($feed->id()) {
-      $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE (title = :title OR url = :url) AND fid <> :fid", array(':title' => $feed->label(), ':url' => $feed->url->value, ':fid' => $feed->id()));
+      $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE (title = :title OR url = :url) AND fid <> :fid", array(':title' => $feed->label(), ':url' => $feed->getUrl(), ':fid' => $feed->id()));
     }
     else {
-      $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE title = :title OR url = :url", array(':title' => $feed->label(), ':url' => $feed->url->value));
+      $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE title = :title OR url = :url", array(':title' => $feed->label(), ':url' => $feed->getUrl()));
     }
 
     foreach ($result as $item) {
       if (strcasecmp($item->title, $feed->label()) == 0) {
         form_set_error('title', t('A feed named %feed already exists. Enter a unique title.', array('%feed' => $feed->label())));
       }
-      if (strcasecmp($item->url, $feed->url->value) == 0) {
-        form_set_error('url', t('A feed with this URL %url already exists. Enter a unique URL.', array('%url' => $feed->url->value)));
+      if (strcasecmp($item->url, $feed->getUrl()) == 0) {
+        form_set_error('url', t('A feed with this URL %url already exists. Enter a unique URL.', array('%url' => $feed->getUrl())));
       }
     }
     parent::validate($form, $form_state);
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedInterface.php
index a01f20a..ed03b95 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/FeedInterface.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedInterface.php
@@ -14,6 +14,255 @@
  */
 interface FeedInterface extends ContentEntityInterface {
 
+
+  /**
+   * Sets the title of the feed.
+   *
+   * @param string $title
+   *   A string containing the title of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setTitle($title);
+
+  /**
+   * Returns the language code of the feed..
+   *
+   * @return string
+   *   The languagecode of the feed.
+   */
+  public function getLangcode();
+
+  /**
+   * Sets the Langcode of the feed.
+   *
+   * @param string $langcode.
+   *   A string containing the langcode of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setLangcode($langcode);
+
+
+  /**
+   * Returns the url to the feed.
+   *
+   * @return string
+   *   The url to the feed.
+   */
+  public function getUrl();
+
+  /**
+   * Sets the url to the feed.
+   *
+   *
+   * @param string $url
+   *   A string containing the url of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setUrl($url);
+
+  /**
+   * Returns the refresh rate of the feed.
+   *
+   * @return int
+   *   The refresh rate of the feed.
+   */
+  public function getRefresh();
+
+  /**
+   * Sets the refresh rate of the feed.
+   *
+   *
+   * @param int $refresh
+   *   The refresh rate of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setRefresh($refresh);
+
+  /**
+   *  Returns the last time where the feed was checked for new items, as Unix timestamp.
+   *
+   * @return int
+   *   The Unix Timestamp of the last checked for new items.
+   */
+  public function getChecked();
+
+  /**
+   * Sets the Time when this feed was queued for refresh, 0 if not queued.
+   *
+   *
+   * @param int $checked
+   *   A int with the time of the last refresh.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setChecked($checked);
+
+  /**
+   * Returns the Time when this feed was queued for refresh, 0 if not queued.
+   *
+   * @return int
+   *    A int with the time of the last refresh.
+   */
+  public function getQueued();
+
+  /**
+   * Sets the Time when this feed was queued for refresh, 0 if not queued.
+   *
+   *
+   * @param int $queued
+   *    A int with the time of the last refresh.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setQueued($queued);
+
+  /**
+   * Returns the parent website of the feed.
+   *
+   * @return int
+   *   The node ID of the node where the comment is attached.
+   */
+  public function getLink();
+
+  /**
+   * Sets the parent website of the feed.
+   *
+   *
+   * @param string $link
+   *   A string containing the parent website of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setLink($link);
+
+  /**
+   * Returns the parent website's description.
+   *
+   * @return int
+   *   The node ID of the node where the comment is attached.
+   */
+  public function getDescription();
+
+  /**
+   * Sets the parent website's description.
+   *
+   * @param string $description
+   *   A string containing the langcode of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setDescription($description);
+
+  /**
+   * Returns an image representing the feed.
+   *
+   * @return
+   *   The node ID of the node where the comment is attached.
+   */
+  public function getImage();
+
+  /**
+   * Sets an image representing the feed.
+   *
+   * @param string $image
+   *   A string containing the langcode of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setImage($image);
+
+  /**
+   * Returns the Calculated hash of the feed data, used for validating cache.
+   *
+   * @return string
+   *   The Calculated hash of the feed data.
+   */
+  public function getHash();
+
+  /**
+   * Sets the Calculated hash of the feed data, used for validating cache.
+   *
+   *
+   * @param string $hash
+   *   A string containing the calculated hash of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setHash($hash);
+
+  /**
+   * Returns the  Entity tag HTTP response header, used for validating cache.
+   *
+   * @return int
+   *   The Entity tag HTTP response header.
+   */
+  public function getEtag();
+
+  /**
+   * Sets the  Entity tag HTTP response header, used for validating cache.
+   *
+   * @param string $etag
+   *   A string containing the Entity tag HTTP response header.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setEtag($etag);
+
+  /**
+   * Return when the feed was last modified, as a Unix timestamp.
+   *
+   * @return int
+   *   The timestamp of the last modified.
+   */
+  public function getModified();
+
+  /**
+   * Sets the last modification of the feed as a Unix timestamp.
+   *
+   *
+   * @param int $modified
+   *   A string containing the modification of the feed.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setModified($modified);
+
+  /**
+   * Return the Number of items to display in the feed’s block.
+   *
+   * @return int
+   *   The Number of items to display in the feed’s block.
+   */
+  public function getBlock();
+
+  /**
+   * Sets Number of items to display in the feed’s block
+   *
+   * @param int $block
+   *   A int containing the Number of items to display in the feed’s block.
+   *
+   * @return \Drupal\aggregator\FeedInterface
+   *   The class instance that this method is called on.
+   */
+  public function setBlock($block);
+
+
   /**
    * Removes all items from a feed.
    */
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php
index 0959fb0..3a9053c 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/OpmlFeedAdd.php
@@ -208,8 +208,8 @@ public function submitForm(array &$form, array &$form_state) {
           drupal_set_message(t('A feed named %title already exists.', array('%title' => $old->label())), 'warning');
           continue 2;
         }
-        if (strcasecmp($old->url->value, $feed['url']) == 0) {
-          drupal_set_message(t('A feed with the URL %url already exists.', array('%url' => $old->url->value)), 'warning');
+        if (strcasecmp($old->getUrl(), $feed['url']) == 0) {
+          drupal_set_message(t('A feed with the URL %url already exists.', array('%url' => $old->getUrl())), 'warning');
           continue 2;
         }
       }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php
index 73c015d..d4166df 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php
@@ -41,129 +41,6 @@
 class Feed extends EntityNG implements FeedInterface {
 
   /**
-   * The feed ID.
-   *
-   * @todo rename to id.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $fid;
-
-  /**
-   * Title of the feed.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $title;
-
-  /**
-   * The feed language code.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $langcode;
-
-  /**
-   * URL to the feed.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $url;
-
-  /**
-   * How often to check for new feed items, in seconds.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $refresh;
-
-  /**
-   * Last time feed was checked for new items, as Unix timestamp.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $checked;
-
-  /**
-   * Time when this feed was queued for refresh, 0 if not queued.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $queued;
-
-  /**
-   * The parent website of the feed; comes from the <link> element in the feed.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $link ;
-
-  /**
-   * The parent website's description;
-   * comes from the <description> element in the feed.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $description;
-
-  /**
-   * An image representing the feed.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $image;
-
-  /**
-   * Calculated hash of the feed data, used for validating cache.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $hash;
-
-  /**
-   * Entity tag HTTP response header, used for validating cache.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $etag;
-
-  /**
-   * When the feed was last modified, as a Unix timestamp.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $modified;
-
-  /**
-   * Number of items to display in the feed’s block.
-   *
-   * @var \Drupal\Core\Entity\Field\FieldInterface
-   */
-  public $block;
-
-  /**
-   * Overrides Drupal\Core\Entity\EntityNG::init().
-   */
-  public function init() {
-    parent::init();
-
-    // We unset all defined properties, so magic getters apply.
-    unset($this->fid);
-    unset($this->title);
-    unset($this->url);
-    unset($this->refresh);
-    unset($this->checked);
-    unset($this->queued);
-    unset($this->link);
-    unset($this->description);
-    unset($this->image);
-    unset($this->hash);
-    unset($this->etag);
-    unset($this->modified);
-    unset($this->block);
-  }
-
-  /**
    * Implements Drupal\Core\Entity\EntityInterface::id().
    */
   public function id() {
@@ -186,10 +63,10 @@ public function removeItems() {
       $manager->createInstance($id)->remove($this);
     }
     // Reset feed.
-    $this->checked->value = 0;
-    $this->hash->value = '';
-    $this->etag->value = '';
-    $this->modified->value = 0;
+    $this->setChecked(0);
+    $this->setHash('');
+    $this->setEtag('');
+    $this->setModified(0);
     $this->save();
   }
 
@@ -264,4 +141,192 @@ protected function clearBlockCacheDefinitions() {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getLangcode() {
+    return $this->get('langcode')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getUrl() {
+    return $this->get('url')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRefresh() {
+    return $this->get('refresh')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChecked() {
+    return $this->get('checked')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQueued() {
+    return $this->get('queued')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLink() {
+    return $this->get('link')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDescription() {
+    return $this->get('description')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getImage() {
+    return $this->get('image')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getHash() {
+    return $this->get('hash')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEtag() {
+    return $this->get('etag')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getModified() {
+    return $this->get('modified')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBlock() {
+    return $this->get('block')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTitle($title) {
+    $this->set('title', $title);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setLangcode($langcode) {
+    $this->set('langcode', $langcode);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUrl($url) {
+    $this->set('url', $url);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setRefresh($refresh) {
+    $this->set('refresh', $refresh);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setChecked($checked) {
+    $this->set('checked', $checked);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setQueued($queued) {
+    $this->set('queued', $queued);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setLink($link) {
+    $this->set('link', $link);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDescription($description) {
+    $this->set('description', $description);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setImage($image) {
+    $this->set('image', $image);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setHash($hash) {
+    $this->set('hash', $hash);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setEtag($etag) {
+    $this->set('etag', $etag);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setModified($modified) {
+    $this->set('modified', $modified);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setBlock($block) {
+    $this->set('block', $block);
+    return $this;
+  }
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/FetcherInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/FetcherInterface.php
index da1377d..5746384 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/FetcherInterface.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/FetcherInterface.php
@@ -25,7 +25,7 @@
    *
    * @param \Drupal\aggregator\Plugin\Core\Entity\Feed $feed
    *   A feed object representing the resource to be downloaded.
-   *   $feed->url->value contains the link to the feed.
+   *   $feed->getUrl() contains the link to the feed.
    *   Download the data at the URL and expose it
    *   to other modules by attaching it to $feed->source_string.
    *
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php
index e98411e..4301057 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/fetcher/DefaultFetcher.php
@@ -36,24 +36,24 @@ public function fetch(Feed $feed) {
     $feed->source_string = FALSE;
 
     // Generate conditional GET headers.
-    if ($feed->etag->value) {
-      $request->addHeader('If-None-Match', $feed->etag->value);
+    if ($feed->getEtag()) {
+      $request->addHeader('If-None-Match', $feed->getEtag());
     }
-    if ($feed->modified->value) {
-      $request->addHeader('If-Modified-Since', gmdate(DATE_RFC1123, $feed->modified->value));
+    if ($feed->getModified()) {
+      $request->addHeader('If-Modified-Since', gmdate(DATE_RFC1123, $feed->getModified()));
     }
 
     try {
       $response = $request->send();
       $feed->source_string = $response->getBody(TRUE);
-      $feed->etag = $response->getEtag();
-      $feed->modified = strtotime($response->getLastModified());
+      $feed->setEtag($response->getEtag());
+      $feed->setModified(strtotime($response->getLastModified()));
       $feed->http_headers = $response->getHeaders();
 
       // Update the feed URL in case of a 301 redirect.
       if ($previous_response = $response->getPreviousResponse()) {
         if ($previous_response->getStatusCode() == 301 && $location = $previous_response->getLocation()) {
-          $feed->url->value = $location;
+          $feed->setUrl($location);
         }
       }
       return TRUE;
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php
index b21b9f5..8482473 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/aggregator/parser/DefaultParser.php
@@ -44,10 +44,10 @@ public function parse(Feed $feed) {
       return FALSE;
     }
 
-    $feed->link->value = $channel->getLink();
-    $feed->description->value = $channel->getDescription();
+    $feed->setLink($channel->getLink());
+    $feed->setDescription($channel->getDescription());
     if ($image = $channel->getImage()) {
-      $feed->image->value = $image['uri'];
+      $feed->setImage($image['uri']);
     }
     // Initialize items array.
     $feed->items = array();
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AddFeedTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AddFeedTest.php
index 6d27c91..71078fb 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AddFeedTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AddFeedTest.php
@@ -27,7 +27,7 @@ function testAddFeed() {
 
     // Check feed data.
     $this->assertEqual($this->getUrl(), url('admin/config/services/aggregator/add/feed', array('absolute' => TRUE)), 'Directed to correct url.');
-    $this->assertTrue($this->uniqueFeed($feed->label(), $feed->url->value), 'The feed is unique.');
+    $this->assertTrue($this->uniqueFeed($feed->label(), $feed->getUrl()), 'The feed is unique.');
 
     // Check feed source.
     $this->drupalGet('aggregator/sources/' . $feed->id());
@@ -55,8 +55,8 @@ function testAddLongFeed() {
     $feed_2 = $this->createFeed($long_url_2);
 
     // Check feed data.
-    $this->assertTrue($this->uniqueFeed($feed->label(), $feed->url->value), 'The first long URL feed is unique.');
-    $this->assertTrue($this->uniqueFeed($feed_2->label(), $feed_2->url->value), 'The second long URL feed is unique.');
+    $this->assertTrue($this->uniqueFeed($feed->label(), $feed->getUrl()), 'The first long URL feed is unique.');
+    $this->assertTrue($this->uniqueFeed($feed_2->label(), $feed_2->getUrl()), 'The second long URL feed is unique.');
 
     // Check feed source.
     $this->drupalGet('aggregator/sources/' . $feed->id());
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorRenderingTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorRenderingTest.php
index 8d50401..b166258 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorRenderingTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorRenderingTest.php
@@ -70,7 +70,7 @@ public function testBlockLinks() {
 
     // Set the number of news items to 0 to test that the block does not show
     // up.
-    $feed->block = 0;
+    $feed->setBlock(0);
     $feed->save();
     // Check that the block is no longer displayed.
     $this->drupalGet('test-page');
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
index 6450975..9a837e5 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
@@ -154,8 +154,8 @@ function getDefaultFeedItemCount() {
    */
   function updateFeedItems(Feed $feed, $expected_count = NULL) {
     // First, let's ensure we can get to the rss xml.
-    $this->drupalGet($feed->url->value);
-    $this->assertResponse(200, format_string('!url is reachable.', array('!url' => $feed->url->value)));
+    $this->drupalGet($feed->getUrl());
+    $this->assertResponse(200, format_string('!url is reachable.', array('!url' => $feed->getUrl())));
 
     // Attempt to access the update link directly without an access token.
     $this->drupalGet('admin/config/services/aggregator/update/' . $feed->id());
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/CategorizeFeedTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/CategorizeFeedTest.php
index 569f26a..f149b62 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/CategorizeFeedTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/CategorizeFeedTest.php
@@ -43,7 +43,7 @@ function testCategorizeFeed() {
     }
 
     $feed->save();
-    $db_fid = db_query("SELECT fid FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed->label(), ':url' => $feed->url->value))->fetchField();
+    $db_fid = db_query("SELECT fid FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed->label(), ':url' => $feed->getUrl()))->fetchField();
 
     $db_feed = aggregator_feed_load($db_fid);
     // Assert the feed has two categories.
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedFetcherPluginTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedFetcherPluginTest.php
index ac254e6..936905b 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedFetcherPluginTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedFetcherPluginTest.php
@@ -42,7 +42,7 @@ public function testfetch() {
     // Remove items and restore checked property to 0.
     $this->removeFeedItems($feed);
     // Change its name and try again.
-    $feed->title->value = 'Do not fetch';
+    $feed->setTitle('Do not fetch');
     $feed->save();
     $this->updateFeedItems($feed);
     // Fetch should fail due to feed name.
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedLanguageTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedLanguageTest.php
index d297abc..b96079e 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedLanguageTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedLanguageTest.php
@@ -61,8 +61,8 @@ public function testFeedLanguage() {
     $feeds[2] = $this->createFeed(NULL, array('langcode' => $this->langcodes[2]->id));
 
     // Make sure that the language has been assigned.
-    $this->assertEqual($feeds[1]->language()->id, $this->langcodes[1]->id);
-    $this->assertEqual($feeds[2]->language()->id, $this->langcodes[2]->id);
+    $this->assertEqual($feeds[1]->getLangcode(), $this->langcodes[1]->id);
+    $this->assertEqual($feeds[2]->getLangcode(), $this->langcodes[2]->id);
 
     // Create example nodes to create feed items from and then update the feeds.
     $this->createSampleNodes();
@@ -74,7 +74,7 @@ public function testFeedLanguage() {
       $items = entity_load_multiple_by_properties('aggregator_item', array('fid' => $feed->id()));
       $this->assertTrue(count($items) > 0, 'Feed items were created.');
       foreach ($items as $item) {
-        $this->assertEqual($item->language()->id, $feed->language()->id);
+        $this->assertEqual($item->language()->id, $feed->getLangcode());
       }
     }
   }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedParserTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedParserTest.php
index bdbe11f..218fea8 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedParserTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedParserTest.php
@@ -92,7 +92,7 @@ function testRedirectFeed() {
     aggregator_refresh($feed);
 
     // Make sure that the feed URL was updated correctly.
-    $this->assertEqual($feed->url->value, url('aggregator/test-feed', array('absolute' => TRUE)));
+    $this->assertEqual($feed->getUrl(), url('aggregator/test-feed', array('absolute' => TRUE)));
   }
 
   /**
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedProcessorPluginTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedProcessorPluginTest.php
index a577b72..195464d 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedProcessorPluginTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/FeedProcessorPluginTest.php
@@ -52,7 +52,7 @@ public function testRemove() {
     $feed = $this->createFeed();
     $this->updateAndRemove($feed, NULL);
     // Make sure the feed title is changed.
-    $entities = entity_load_multiple_by_properties('aggregator_feed', array('description' => $feed->description->value));
+    $entities = entity_load_multiple_by_properties('aggregator_feed', array('description' => $feed->getDescription()));
     $this->assertTrue(empty($entities));
   }
 
@@ -65,6 +65,6 @@ public function testPostProcess() {
     // Reload the feed to get new values.
     $feed = entity_load('aggregator_feed', $feed->id(), TRUE);
     // Make sure its refresh rate doubled.
-    $this->assertEqual($feed->refresh->value, 3600);
+    $this->assertEqual($feed->getRefresh(), 3600);
   }
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/RemoveFeedTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/RemoveFeedTest.php
index f16665d..8b75bd2 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/RemoveFeedTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/RemoveFeedTest.php
@@ -33,7 +33,7 @@ function testRemoveFeed() {
     $this->assertResponse(404, 'Deleted feed source does not exists.');
 
     // Check database for feed.
-    $result = db_query("SELECT COUNT(*) FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed->label(), ':url' => $feed->url->value))->fetchField();
+    $result = db_query("SELECT COUNT(*) FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed->label(), ':url' => $feed->getUrl()))->fetchField();
     $this->assertFalse($result, 'Feed not found in database');
   }
 }
