diff --git a/config/schema/media_entity_instagram.schema.yml b/config/schema/media_entity_instagram.schema.yml
index 0c894ed..4248e30 100644
--- a/config/schema/media_entity_instagram.schema.yml
+++ b/config/schema/media_entity_instagram.schema.yml
@@ -22,11 +22,8 @@ media_entity.bundle.type.instagram:
 
 field.formatter.settings.instagram_embed:
   type: mapping
-  label: 'Image field display format settings'
+  label: 'Instagram field display format settings'
   mapping:
-    width:
-      type: integer
-      label: 'Width'
-    height:
-      type: integer
-      label: 'Height'
+    hidecaption:
+      type: boolean
+      label: 'Caption hidden'
diff --git a/media_entity_instagram.libraries.yml b/media_entity_instagram.libraries.yml
new file mode 100644
index 0000000..5b25e3a
--- /dev/null
+++ b/media_entity_instagram.libraries.yml
@@ -0,0 +1,8 @@
+instagram.embeds:
+  remote: //platform.instagram.com/en_US/embeds.js
+  version: 1.0.0
+  license:
+    name: MIT
+    gpl-compatible: true
+  js:
+    //platform.instagram.com/en_US/embeds.js: { type: external, minified: true }
diff --git a/media_entity_instagram.module b/media_entity_instagram.module
index b3d9bbc..aa6dcb2 100644
--- a/media_entity_instagram.module
+++ b/media_entity_instagram.module
@@ -1 +1,13 @@
 <?php
+
+/**
+ * Implements hook_theme().
+ */
+function media_entity_instagram_theme() {
+  return [
+    'media_entity_instagram_post' => [
+      'variables' => ['post' => NULL],
+    ],
+  ];
+}
+
diff --git a/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php b/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php
index ea86b38..4c6bb8f 100644
--- a/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/InstagramEmbedFormatter.php
@@ -31,29 +31,47 @@ class InstagramEmbedFormatter extends FormatterBase {
     $settings = $this->getSettings();
     foreach ($items as $delta => $item) {
       $matches = [];
+
       foreach (Instagram::$validationRegexp as $pattern => $key) {
-        if (preg_match($pattern, $this->getEmbedCode($item), $matches)) {
-          break;
+        if (preg_match($pattern, $this->getEmbedCode($item), $item_matches)) {
+          $matches[] = $item_matches;
         }
       }
 
+      if (!empty($matches)) {
+        $matches = reset($matches);
+      }
+
       if (!empty($matches['shortcode'])) {
-        $element[$delta] = [
-          '#type' => 'html_tag',
-          '#tag' => 'iframe',
-          '#attributes' => [
-            'allowtransparency' => 'true',
-            'frameborder' => 0,
-            'position' => 'absolute',
-            'scrolling' => 'no',
-            'src' => '//instagram.com/p/' . $matches['shortcode'] . '/embed/',
-            'width' => $settings['width'],
-            'height' => $settings['height'],
-          ],
-        ];
+
+        if (isset($settings['hidecaption'])) {
+          $hidecaption = $settings['hidecaption'];
+        }
+
+        // TODO: Move to service with caching.
+        try {
+          $client = \Drupal::httpClient();
+          $request = $client->request('GET', 'http://api.instagram.com/oembed?url=http://instagr.am/p/' . $matches['shortcode'] . '/&hidecaption=' . $hidecaption . '&omitscript=true');
+
+          if ($request->getStatusCode() === 200) {
+            $instagram_json = json_decode($request->getBody()->getContents());
+            $element[$delta] = [
+              '#theme' => 'media_entity_instagram_post',
+              '#post' => (string) $instagram_json->html,
+            ];
+          }
+        } catch(Exception $e) {}
       }
     }
 
+    if (!empty($element)) {
+      $element['#attached'] = [
+        'library' => [
+          'media_entity_instagram/instagram.embeds',
+        ],
+      ];
+    }
+
     return $element;
   }
 
@@ -62,8 +80,7 @@ class InstagramEmbedFormatter extends FormatterBase {
    */
   public static function defaultSettings() {
     return array(
-      'width' => '480',
-      'height' => '640',
+      'hidecaption' => FALSE,
     ) + parent::defaultSettings();
   }
 
@@ -73,20 +90,11 @@ class InstagramEmbedFormatter extends FormatterBase {
   public function settingsForm(array $form, FormStateInterface $form_state) {
     $elements = parent::settingsForm($form, $form_state);
 
-    $elements['width'] = array(
-      '#type' => 'number',
-      '#title' => $this->t('Width'),
-      '#default_value' => $this->getSetting('width'),
-      '#min' => 1,
-      '#description' => $this->t('Width of instagram.'),
-    );
-
-    $elements['height'] = array(
-      '#type' => 'number',
-      '#title' => $this->t('Height'),
-      '#default_value' => $this->getSetting('height'),
-      '#min' => 1,
-      '#description' => $this->t('Height of instagram.'),
+    $elements['hidecaption'] = array(
+      '#type' => 'checkbox',
+      '#title' => $this->t('Caption hidden'),
+      '#default_value' => $this->getSetting('hidecaption'),
+      '#description' => $this->t('Enable to hide caption of Instagram posts.'),
     );
 
     return $elements;
@@ -96,13 +104,9 @@ class InstagramEmbedFormatter extends FormatterBase {
    * {@inheritdoc}
    */
   public function settingsSummary() {
+    $settings = $this->getSettings();
     return [
-      $this->t('Width: @width px', [
-        '@width' => $this->getSetting('width'),
-      ]),
-      $this->t('Height: @height px', [
-        '@height' => $this->getSetting('height'),
-      ]),
+      $this->t('Caption: @hidecaption', ['@hidecaption' => $settings['hidecaption'] ? 'Hidden' : 'Visible']),
     ];
   }
 
diff --git a/templates/media-entity-instagram-post.html.twig b/templates/media-entity-instagram-post.html.twig
new file mode 100644
index 0000000..604f750
--- /dev/null
+++ b/templates/media-entity-instagram-post.html.twig
@@ -0,0 +1,9 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a post.
+ *
+ * @ingroup themeable
+ */
+#}
+{{ post|raw }}
