diff --git a/core/themes/seven/css/components/dropzone.css b/core/themes/seven/css/components/dropzone.css
new file mode 100644
index 0000000..ca0798b
--- /dev/null
+++ b/core/themes/seven/css/components/dropzone.css
@@ -0,0 +1,46 @@
+/**
+ * Dropzone.
+ */
+.dropzone-wrapper {
+  border: 1px solid #bfbfbf;
+  border-radius: 2px;
+  background: #fcfcfa;
+}
+
+.dropzone {
+  float: left;
+  height: 90px;
+  width: 90px;
+  background: #faf9f5 url('../../images/dropzone.png') center center no-repeat;
+  border-right: 1px solid #bfbfbf;
+  position: relative;
+}
+.dropzone.is-active {
+  background-image: url('../../images/dropzone-active.png');
+}
+
+.dropzone input[type="file"] {
+  cursor: pointer;
+  position: absolute;
+  opacity: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.dropzone-description {
+  float: left;
+  padding: 1em;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+.dropzone-preview {
+  border: 1px solid #ccc;
+  border-radius: 2px;
+  background: #fdfdfc;
+  margin-bottom: 1em;
+  padding: 0.5em 1em;
+}
diff --git a/core/themes/seven/images/dropzone-active.png b/core/themes/seven/images/dropzone-active.png
new file mode 100755
index 0000000..7ecb69e
--- /dev/null
+++ b/core/themes/seven/images/dropzone-active.png
@@ -0,0 +1,5 @@
+PNG
+
+   IHDR   D   D   8   tEXtSoftware Adobe ImageReadyqe<  &iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2015 (Windows)" xmpMM:InstanceID="xmp.iid:203EE965C91E11E5A239B22E8DC3709D" xmpMM:DocumentID="xmp.did:203EE966C91E11E5A239B22E8DC3709D"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:203EE963C91E11E5A239B22E8DC3709D" stRef:documentID="xmp.did:203EE964C91E11E5A239B22E8DC3709D"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>  IDATxOHQǟBvX]7kttx
+
+D')(RjPP!)u%M>f}2_g͗tNΚZ-kf+.'^Ӡ0Ctt{oxqyא^p {.m<hë406\CzկI^t /Mы-IIKeJP6#h!]	SUBCREmr,>Rε"LI+<?M$^uVLŠdfw%ِL>CjPeYbb戉^s3&f21Ԣ^q4$s-CC3UU||e31KN̲Q.QO]013LLXehGabf$f*,=21"&[kCBChHELwJ<3K|'c*CCh3K;KxbEIRl'fĀvOfH3AP4OEQevȦ*lV\zE#q깞ߕU"yU9֡ǣ(nؒ&Er|tk~	@z<6kddc) (̤@    IENDB`
\ No newline at end of file
diff --git a/core/themes/seven/images/dropzone.png b/core/themes/seven/images/dropzone.png
new file mode 100755
index 0000000..8b50676
--- /dev/null
+++ b/core/themes/seven/images/dropzone.png
@@ -0,0 +1,4 @@
+PNG
+
+   IHDR   D   D   8   tEXtSoftware Adobe ImageReadyqe<  &iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2015 (Windows)" xmpMM:InstanceID="xmp.iid:A26AEC2BC91D11E5B33FB7CC67E672F6" xmpMM:DocumentID="xmp.did:A26AEC2CC91D11E5B33FB7CC67E672F6"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:A26AEC29C91D11E5B33FB7CC67E672F6" stRef:documentID="xmp.did:A26AEC2AC91D11E5B33FB7CC67E672F6"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?># ߪ  IDATx?hAbTTPK	BLe iZ	F&IXBxZ%!"1^56&q>1w{oP*Jp` xl1J	0.{Ig3p4W1CM	ޜ$BFWr4H<x"ɛFm?i;:M/$ntI!0SiH8$_ĐiPǐصܗ^dd'ŬĐ>}rX_֐dYA;eh!4d95KC$-o2Rz)WȄvNFlxTZ17&'sE<fnPQ<DVeOgc0o&@?2AWΨ=/SӱrS1;	.CB ː<T̎|uaAܺ}zR!+$L^Ċ*sVbPeŌYАEd1sb61y[b&>ؿ2B40w&ٯ9;r!4'+V̪eX1sĊYX1c!4dY3G*f[chPU։vȃz#3y="u:zt\F#2d}yﶜ5c Ɨ}XIZۖtn@hq鹮Ͼ}bT}|Av֔m=BꕱI Z10X1yS,
+-Τ^q  cS    IENDB`
\ No newline at end of file
diff --git a/core/themes/seven/images/file.png b/core/themes/seven/images/file.png
new file mode 100755
index 0000000..311768f
--- /dev/null
+++ b/core/themes/seven/images/file.png
@@ -0,0 +1,3 @@
+PNG
+
+   IHDR         U1   tEXtSoftware Adobe ImageReadyqe<  &iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2015 (Windows)" xmpMM:InstanceID="xmp.iid:D3EEE4B1C91D11E5BF24CA8785E8CE6A" xmpMM:DocumentID="xmp.did:D3EEE4B2C91D11E5BF24CA8785E8CE6A"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:D3EEE4AFC91D11E5BF24CA8785E8CE6A" stRef:documentID="xmp.did:D3EEE4B0C91D11E5BF24CA8785E8CE6A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>}p/   IDATxb=F(]	蒓L 41q.IAăF ne[aTq5r qX(%ygfQj bH	g:" !Eĸ" FԠQA`/&hC~)   /?Y    IENDB`
\ No newline at end of file
diff --git a/core/themes/seven/js/dropzone.js b/core/themes/seven/js/dropzone.js
new file mode 100644
index 0000000..195f77f
--- /dev/null
+++ b/core/themes/seven/js/dropzone.js
@@ -0,0 +1,27 @@
+(function ($, Drupal) {
+
+  'use strict';
+
+  Drupal.behaviors.dropzone = {
+    attach: function (context, settings) {
+      var $dropzone = $('.js-dropzone');
+      $dropzone.on('dragover', function() {
+        $(this).addClass('is-active');
+      });
+
+      $dropzone.on('dragleave', function() {
+        $(this).removeClass('is-active');
+      });
+    }
+  };
+
+  Drupal.behaviors.uploadImage = {
+    attach : function (context, settings) {
+      $('.js-upload-image').click(function(e) {
+        $(this).closest('.js-form-item').find('input[type="file"]').click();
+        e.preventDefault();
+        e.stopPropagation();
+      });
+    }
+  };
+})(jQuery, Drupal);
diff --git a/core/themes/seven/seven.libraries.yml b/core/themes/seven/seven.libraries.yml
index cec9887..84040d8 100644
--- a/core/themes/seven/seven.libraries.yml
+++ b/core/themes/seven/seven.libraries.yml
@@ -13,6 +13,7 @@ global-styling:
       css/components/colors.css: {}
       css/components/messages.css: {}
       css/components/dropbutton.component.css: {}
+      css/components/dropzone.css: {}
       css/components/entity-meta.css: {}
       css/components/field-ui.css: {}
       css/components/form.css: {}
@@ -33,6 +34,8 @@ global-styling:
       css/components/views-ui.css: {}
     layout:
       css/layout/layout.css: {}
+  js:
+    js/dropzone.js: {}
   dependencies:
     - system/admin
 
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index 9afa603..5f0278d 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -186,3 +186,10 @@ function seven_form_node_form_alter(&$form, FormStateInterface $form_state) {
   $form['revision_information']['#type'] = 'container';
   $form['revision_information']['#group'] = 'meta';
 }
+
+/**
+ * Implements hook_theme_suggestions_form_element_alter().
+ */
+function seven_theme_suggestions_form_element_alter(&$suggestions, $variables) {
+  $suggestions[] = 'form_element__' . $variables['element']['#type'];
+}
diff --git a/core/themes/seven/templates/form-element--managed-file.html.twig b/core/themes/seven/templates/form-element--managed-file.html.twig
new file mode 100644
index 0000000..fa477ff
--- /dev/null
+++ b/core/themes/seven/templates/form-element--managed-file.html.twig
@@ -0,0 +1,95 @@
+{#
+/**
+ * @file
+ * Theme override for a managed file form element.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - errors: (optional) Any errors for this form element, may not be set.
+ * - prefix: (optional) The form element prefix, may not be set.
+ * - suffix: (optional) The form element suffix, may not be set.
+ * - required: The required marker, or empty if the associated form element is
+ *   not required.
+ * - type: The type of the element.
+ * - name: The name of the element.
+ * - label: A rendered label element.
+ * - label_display: Label display setting. It can have these values:
+ *   - before: The label is output before the element. This is the default.
+ *     The label includes the #title and the required marker, if #required.
+ *   - after: The label is output after the element. For example, this is used
+ *     for radio and checkbox #type elements. If the #title is empty but the
+ *     field is #required, the label will contain only the required marker.
+ *   - invisible: Labels are critical for screen readers to enable them to
+ *     properly navigate through forms but can be visually distracting. This
+ *     property hides the label for everyone except screen readers.
+ *   - attribute: Set the title attribute on the element to create a tooltip but
+ *     output no label element. This is supported only for checkboxes and radios
+ *     in \Drupal\Core\Render\Element\CompositeFormElementTrait::preRenderCompositeFormElement().
+ *     It is used where a visual label is not needed, such as a table of
+ *     checkboxes where the row and column provide the context. The tooltip will
+ *     include the title and required marker.
+ * - description: (optional) A list of description properties containing:
+ *    - content: A description of the form element, may not be set.
+ *    - attributes: (optional) A list of HTML attributes to apply to the
+ *      description content wrapper. Will only be set when description is set.
+ * - description_display: Description display setting. It can have these values:
+ *   - before: The description is output before the element.
+ *   - after: The description is output after the element. This is the default
+ *     value.
+ *   - invisible: The description is output after the element, hidden visually
+ *     but available to screen readers.
+ * - disabled: True if the element is disabled.
+ * - title_display: Title display setting.
+ *
+ * @see template_preprocess_form_element()
+ */
+#}
+{%
+  set classes = [
+    'js-form-item',
+    'form-item',
+    'js-form-type-' ~ type|clean_class,
+    'form-type-' ~ type|clean_class,
+    'js-form-item-' ~ name|clean_class,
+    'form-item-' ~ name|clean_class,
+    'dropzone-wrapper',
+    'clearfix',
+    disabled == 'disabled' ? 'form-disabled',
+    errors ? 'form-item--error',
+  ]
+%}
+{%
+  set description_classes = [
+    'dropzone-description',
+    description_display == 'invisible' ? 'visually-hidden',
+  ]
+%}
+<div class="dropzone-previews">
+</div>
+<div{{ attributes.addClass(classes) }}>
+  {% if prefix is not empty %}
+    <span class="field-prefix">{{ prefix }}</span>
+  {% endif %}
+  <div class="dropzone js-dropzone">
+    {{ children }}
+  </div>
+  {% if suffix is not empty %}
+    <span class="field-suffix">{{ suffix }}</span>
+  {% endif %}
+  {% if label_display == 'after' %}
+    {{ label }}
+  {% endif %}
+  {% if errors %}
+    <div class="form-item--error-message">
+      <strong>{{ errors }}</strong>
+    </div>
+  {% endif %}
+  {% if description.content %}
+    <div{{ description.attributes.addClass(description_classes) }}>
+      <div>
+        <a href="#" class="button button--small js-upload-image">{{ 'Add Files'|t }}</a>
+      </div>
+      {{ description.content }}
+    </div>
+  {% endif %}
+</div>
