diff --git a/src/DynamicEntityReferenceFieldItemList.php b/src/DynamicEntityReferenceFieldItemList.php
index 5f6ae5f..af595ee 100644
--- a/src/DynamicEntityReferenceFieldItemList.php
+++ b/src/DynamicEntityReferenceFieldItemList.php
@@ -80,20 +80,16 @@ class DynamicEntityReferenceFieldItemList extends EntityReferenceFieldItemList {
       $entity_uuids = array();
       foreach ($all_uuids as $target_type => $uuids) {
         if ($uuids) {
-          $entity_ids = \Drupal::entityQuery($target_type)
-            ->condition('uuid', $uuids, 'IN')
-            ->execute();
           $entities = \Drupal::entityManager()
             ->getStorage($target_type)
-            ->loadMultiple($entity_ids);
+            ->loadByProperties(array('uuid' => $uuids));
           $entity_uuids[$target_type] = array();
           foreach ($entities as $id => $entity) {
             $entity_uuids[$target_type][$entity->uuid()] = $id;
           }
           foreach ($uuids as $delta => $uuid) {
-            if (isset($entity_uuids[$uuid])) {
+            if (isset($entity_uuids[$target_type]) && isset($entity_uuids[$target_type][$uuid])) {
               $default_value[$delta]['target_id'] = $entity_uuids[$target_type][$uuid];
-              $default_value[$delta]['target_type'] = $target_type;
               unset($default_value[$delta]['target_uuid']);
             }
             else {
diff --git a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
index 2ffd600..533b4c4 100644
--- a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
+++ b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
@@ -136,6 +136,11 @@ class DynamicEntityReferenceItem extends ConfigurableEntityReferenceItem {
 
   /**
    * {@inheritdoc}
+   *
+   * To select both target_type and target_id the option value is
+   * changed from target_id to target_type-target_id.
+   *
+   * @see \Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget\DynamicEntityReferenceOptionsTrait::massageFormValues()
    */
   public function getSettableOptions(AccountInterface $account = NULL) {
     $field_definition = $this->getFieldDefinition();
@@ -149,12 +154,14 @@ class DynamicEntityReferenceItem extends ConfigurableEntityReferenceItem {
       return array();
     }
     $return = array();
-    foreach ($options as $target_type) {
+    foreach ($options as $target_type => $referenceable_entities) {
       // Rebuild the array by changing the bundle key into the bundle label.
       $bundles = \Drupal::entityManager()->getBundleInfo($target_type);
-      foreach ($options[$target_type] as $bundle => $entity_ids) {
+      foreach ($referenceable_entities as $bundle => $entities) {
         $bundle_label = String::checkPlain($bundles[$bundle]['label']);
-        $return[$target_types[$target_type]][$bundle_label] = $entity_ids;
+        foreach ($entities as $id => $entity_label) {
+          $return[$bundle_label]["{$target_type}-{$id}"] = $entity_label;
+        }
       }
     }
 
@@ -317,6 +324,14 @@ class DynamicEntityReferenceItem extends ConfigurableEntityReferenceItem {
   /**
    * {@inheritdoc}
    */
+  public static function mainPropertyName() {
+    // We have two main properties i.e. target_type and target_id.
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function setValue($values, $notify = TRUE) {
     if (empty($values['target_type']) && !empty($values['target_id'])) {
       throw new \InvalidArgumentException('No entity type was provided, value is not a valid entity.');
diff --git a/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsButtonsWidget.php b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsButtonsWidget.php
new file mode 100644
index 0000000..df511ce
--- /dev/null
+++ b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsButtonsWidget.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget\DynamicEntityReferenceOptionsButtonsWidget.
+ */
+
+namespace Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget;
+
+/**
+ * Plugin implementation of the 'options_buttons' widget.
+ *
+ * @FieldWidget(
+ *   id = "dynamic_entity_reference_options_buttons",
+ *   label = @Translation("Check boxes/radio buttons"),
+ *   field_types = {
+ *     "dynamic_entity_reference",
+ *   },
+ *   multiple_values = TRUE
+ * )
+ */
+class DynamicEntityReferenceOptionsButtonsWidget extends OptionsButtonsWidget {
+  use DynamicEntityReferenceOptionsTrait;
+
+}
diff --git a/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsSelectWidget.php b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsSelectWidget.php
new file mode 100644
index 0000000..a2aa4f3
--- /dev/null
+++ b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsSelectWidget.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget\DynamicEntityReferenceOptionsSelectWidget.
+ */
+
+namespace Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget;
+
+/**
+ * Plugin implementation of the 'options_select' widget.
+ *
+ * @FieldWidget(
+ *   id = "dynamic_entity_reference_options_select",
+ *   label = @Translation("Select list"),
+ *   field_types = {
+ *     "dynamic_entity_reference",
+ *   },
+ *   multiple_values = TRUE
+ * )
+ */
+class DynamicEntityReferenceOptionsSelectWidget extends OptionsSelectWidget {
+
+  use DynamicEntityReferenceOptionsTrait;
+
+}
diff --git a/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsTrait.php b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsTrait.php
new file mode 100644
index 0000000..1bf3c54
--- /dev/null
+++ b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceOptionsTrait.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget\DynamicEntityReferenceOptionsTrait.
+ */
+
+namespace Drupal\dynamic_entity_reference\Plugin\Field\FieldWidget;
+
+
+use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\OptGroup;
+use Drupal\dynamic_entity_reference\Plugin\Field\FieldType\DynamicEntityReferenceItem;
+
+trait DynamicEntityReferenceOptionsTrait {
+
+  /**
+   * {@inheritdoc}
+   *
+   * This widget only support single target type dynamic entity reference
+   * fields. Select list Check boxes and radio buttons don't make sense for
+   * multiple target_types.
+   */
+  public static function isApplicable(FieldDefinitionInterface $field_definition) {
+    return count(DynamicEntityReferenceItem::getTargetTypes($field_definition->getSettings())) == 1;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getSelectedOptions(FieldItemListInterface $items, $delta = 0) {
+    // We need to check against a flat list of options.
+    $flat_options = OptGroup::flattenOptions($this->getOptions($items->getEntity()));
+
+    $selected_options = array();
+    foreach ($items as $item) {
+      $value = "{$item->target_type}-{$item->target_id}";
+      // Keep the value if it actually is in the list of options (needs to be
+      // checked against the flat list).
+      if (isset($flat_options[$value])) {
+        $selected_options[] = $value;
+      }
+    }
+
+    return $selected_options;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * To save both target_type and target_id the option value is split into
+   * target_type and target_id.
+   *
+   * @see \Drupal\dynamic_entity_reference\Plugin\Field\FieldType\DynamicEntityReferenceItem::getSettableOptions()
+   */
+  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
+    foreach ($values as $index => $value) {
+      list($values[$index]['target_type'], $values[$index]['target_id']) = explode('-', $value['target_id']);
+    }
+    return $values;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getOptions(FieldableEntityInterface $entity) {
+    $options = parent::getOptions($entity);
+
+    // Add an empty option if the widget needs one.
+    if ($empty_option = $this->getEmptyOption()) {
+      $plugin_id = $this->getPluginId();
+      if (strpos($plugin_id, 'buttons') !== FALSE) {
+        $label = t('N/A');
+      }
+      else {
+        $label = ($empty_option == static::OPTIONS_EMPTY_NONE ? t('- None -') : t('- Select a value -'));
+      }
+
+      $options = array('_none' => $label) + $options;
+    }
+    return $options;
+  }
+
+}
