diff --git a/poll.module b/poll.module
index 06abc65..7d01e42 100644
--- a/poll.module
+++ b/poll.module
@@ -117,6 +117,7 @@ function poll_cron() {
  */
 function template_preprocess_poll_vote(&$variables) {
   $form = $variables['form'];
+  $variables['poll_id'] = $form['#entity']->id();
   $variables['question'] = SafeMarkup::checkPlain($form['#entity']->label());
   $variables['choice'] = drupal_render($form['choice']);
   $variables['vote'] = drupal_render($form['actions']);
diff --git a/src/Entity/Poll.php b/src/Entity/Poll.php
index c2b1cc9..b7135c2 100644
--- a/src/Entity/Poll.php
+++ b/src/Entity/Poll.php
@@ -430,4 +430,13 @@ class Poll extends ContentEntityBase implements PollInterface {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getVotes() {
+    /** @var \Drupal\poll\PollStorage $poll_storage_controller */
+    $poll_storage_controller = \Drupal::entityManager()->getStorage('poll');
+    return $poll_storage_controller->getVotes($this);
+  }
+
 }
diff --git a/src/Form/PollViewForm.php b/src/Form/PollViewForm.php
index 23f0675..2fba19a 100644
--- a/src/Form/PollViewForm.php
+++ b/src/Form/PollViewForm.php
@@ -57,7 +57,7 @@ class PollViewForm extends FormBase {
       // the Vote button won't be added so the submit callbacks will not be
       // called. Directly check for the request method and use the raw user
       // input.
-      if ($request->isMethod('POST') && $this->poll->hasUserVoted()) {
+      if ($request && $request->isMethod('POST') && $this->poll->hasUserVoted()) {
         $input = $form_state->getUserInput();
         if (isset($input['op']) && $input['op'] == $this->t('Vote')) {
           // If this happened, then the form submission was likely a cached page.
@@ -85,6 +85,7 @@ class PollViewForm extends FormBase {
 
       $form['#theme'] = 'poll_vote';
       $form['#entity'] = $this->poll;
+      $form['#action'] = $this->poll->url('canonical', ['query' => \Drupal::destination()->getAsArray()]);
       // Set a flag to hide results which will be removed if we want to view
       // results when the form is rebuilt.
       $form_state->set('show_results', FALSE);
@@ -100,6 +101,17 @@ class PollViewForm extends FormBase {
   }
 
   /**
+   * Handles vote submit.
+   */
+  public function ajaxReplaceVoteResult($form, FormStateInterface $form_state) {
+
+    $form['choice'] = $this->showPollResults($this->poll);
+    $form['actions'] = $this->actions($form, $form_state, $this->poll);
+    unset($form['#action']);
+    return $form;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
@@ -112,15 +124,19 @@ class PollViewForm extends FormBase {
       // The "View results" button, when available, has been clicked.
       case $form_state->get('show_results'):
         return TRUE;
+
       // The poll is closed.
       case ($poll->isClosed()):
         return TRUE;
+
       // Anonymous user is trying to view a poll they aren't allowed to vote in.
       case ($account->isAnonymous() && !$poll->getAnonymousVoteAllow()):
         return TRUE;
+
       // The user has already voted.
       case ($poll->hasUserVoted()):
         return TRUE;
+
       default:
         return FALSE;
     }
@@ -155,9 +171,14 @@ class PollViewForm extends FormBase {
       $actions['submit']['#value'] = t('Vote');
       $actions['submit']['#validate'] = array('::validateVote');
       $actions['submit']['#submit'] = array('::save');
+      $actions['submit']['#ajax'] = array(
+        'callback' => '::ajaxReplaceVoteResult',
+        'wrapper' => 'poll-' . $this->poll->id(),
+        'method' => 'replace',
+      );
       $actions['submit']['#weight'] = '0';
 
-      // view results before voting
+      // View results before voting.
       if ($poll->result_vote_allow->value) {
         $actions['result']['#type'] = 'submit';
         $actions['result']['#button_type'] = 'primary';
@@ -184,13 +205,13 @@ class PollViewForm extends FormBase {
     \Drupal::service('page_cache_kill_switch')->trigger();
 
     $total_votes = 0;
-    foreach ($poll->votes as $vote) {
+    foreach ($poll->getVotes() as $vote) {
       $total_votes += $vote;
     }
 
     $options = $poll->getOptions();
     $poll_results = array();
-    foreach ($poll->votes as $pid => $vote) {
+    foreach ($poll->getVotes() as $pid => $vote) {
       $percentage = round($vote * 100 / max($total_votes, 1));
       $display_votes = (!$block) ? ' (' . \Drupal::translation()
           ->formatPlural($vote, '1 vote', '@count votes') . ')' : '';
@@ -250,7 +271,7 @@ class PollViewForm extends FormBase {
    * @param array $form
    * @param array $form_state
    */
-  public function result(array $form, FormStateInterface $form_state) {
+  public function result(array $form, FormStateInterface &$form_state) {
     $form_state->set('show_results', TRUE);
     $form_state->setRebuild(TRUE);
   }
@@ -261,7 +282,7 @@ class PollViewForm extends FormBase {
    * @param array $form
    * @param array $form_state
    */
-  public function back(array $form, FormStateInterface $form_state) {
+  public function back(array $form, FormStateInterface &$form_state) {
     $form_state->set('show_results', FALSE);
     $form_state->setRebuild(TRUE);
   }
diff --git a/src/PollInterface.php b/src/PollInterface.php
index eefda10..f6a8531 100644
--- a/src/PollInterface.php
+++ b/src/PollInterface.php
@@ -155,12 +155,14 @@ interface PollInterface extends ContentEntityInterface {
    * @return mixed
    */
   public function hasUserVoted();
+
   /**
    * Get all options for this poll.
    *
    * @return array
    */
   public function getOptions();
+
   /**
    * Get the values of each vote option for this poll.
    *
@@ -168,4 +170,11 @@ interface PollInterface extends ContentEntityInterface {
    */
   public function getOptionValues();
 
+  /**
+   * Get all the votes of this poll.
+   *
+   * @return array
+   */
+  public function getVotes();
+
 }
diff --git a/templates/poll-vote.html.twig b/templates/poll-vote.html.twig
index 3161dd4..199829f 100644
--- a/templates/poll-vote.html.twig
+++ b/templates/poll-vote.html.twig
@@ -2,7 +2,7 @@
 /**
  */
 #}
-<div class="poll">
+<div id="poll-{{ poll_id }}" class="poll">
   <div class="vote-form">
     {% if show_question %}
       <h3 class="poll-question">{{ question }}</h3>
