diff --git a/core/modules/contextual/contextual.js b/core/modules/contextual/contextual.js
index b5ad030..0759515 100644
--- a/core/modules/contextual/contextual.js
+++ b/core/modules/contextual/contextual.js
@@ -7,6 +7,8 @@
 
 "use strict";
 
+var contextuals = [];
+
 /**
  * Attaches outline behavior for regions associated with contextual links.
  */
@@ -14,7 +16,14 @@ Drupal.behaviors.contextual = {
   attach: function (context) {
     $('ul.contextual-links', context).once('contextual', function () {
       var $this = $(this);
-      $this.data('drupal-contextual', new Drupal.contextual(this, $this.closest('.contextual-region')));
+      var contextual = new Drupal.contextual(this, $this.closest('.contextual-region'));
+      contextuals.push(contextual);
+      $this.data('drupal-contextual', contextual);
+    });
+    // Bind to global edit mode changes
+    $('body').once('contextual', function (index, element) {
+      $(document)
+        .on('drupalEditMode.contextual', toggleEditMode);
     });
   }
 };
@@ -45,15 +54,32 @@ Drupal.contextual.prototype.init = function() {
     .text(Drupal.t('@action configuration options', {'@action': action}))
     .prependTo(this.$wrapper);
 
-  // Bind behaviors through delegation.
-  var highlightRegion = $.proxy(this.highlightRegion, this);
+  // The trigger behaviors are never detached or mutated.
   this.$region
     .on('click.contextual', '.contextual .trigger', $.proxy(this.triggerClickHandler, this))
-    .on('mouseenter.contextual', {highlight: true}, highlightRegion)
-    .on('mouseleave.contextual', {highlight: false}, highlightRegion)
     .on('mouseleave.contextual', '.contextual', {show: false}, $.proxy(this.triggerLeaveHandler, this))
-    .on('focus.contextual', '.contextual-links a, .contextual .trigger', {highlight: true}, highlightRegion)
-    .on('blur.contextual', '.contextual-links a, .contextual .trigger', {highlight: false}, highlightRegion);
+  // Attach highlight behaviors.
+  this.attachHighlightBehaviors();
+};
+
+/**
+ *
+ */
+Drupal.contextual.prototype.attachHighlightBehaviors = function () {
+  // Bind behaviors through delegation.
+  var highlightRegion = $.proxy(this.highlightRegion, this);
+  this.$region
+    .on('mouseenter.contextual.highlight', {highlight: true}, highlightRegion)
+    .on('mouseleave.contextual.highlight', {highlight: false}, highlightRegion)
+    .on('focus.contextual.highlight', '.contextual-links a, .contextual .trigger', {highlight: true}, highlightRegion)
+    .on('blur.contextual.highlight', '.contextual-links a, .contextual .trigger', {highlight: false}, highlightRegion);
+};
+
+/**
+ *
+ */
+Drupal.contextual.prototype.detachHighlightBehaviors = function () {
+  this.$region.off('.contextual.highlight');
 };
 
 /**
@@ -121,6 +147,16 @@ Drupal.contextual.prototype.showLinks = function(show) {
 };
 
 /**
+ *
+ */
+function toggleEditMode (event, data) {
+  for (var i = contextuals.length - 1; i >= 0; i--) {
+    contextuals[i][(data.editable) ? 'detachHighlightBehaviors' : 'attachHighlightBehaviors']();
+    contextuals[i].$region.toggleClass('contextual-region-active', data.editable);
+  };
+}
+
+/**
  * Wraps contextual links.
  *
  * @return {String}
diff --git a/core/modules/contextual/contextual.theme.css b/core/modules/contextual/contextual.theme.css
index 2855dca..122234c 100644
--- a/core/modules/contextual/contextual.theme.css
+++ b/core/modules/contextual/contextual.theme.css
@@ -13,7 +13,7 @@
   z-index: 999;
 }
 .contextual-region-active {
-  outline: 1px dashed #d6d6d6;
+  outline: 1px solid #007fff;
   outline-offset: 1px;
 }
 
@@ -21,28 +21,27 @@
  * Contextual trigger.
  */
 .contextual .trigger {
-  background: transparent url("images/gear-select.png") no-repeat 2px 0;
-  border: 1px solid transparent;
-  border-radius: 4px 4px 0 0;
+  background: #ffffff url("../../misc/edit.png") no-repeat center center;
+  background-size: 16px 16px;
+  border: 1px solid #ddd;
+  border-radius: 13px;
+  box-shadow:1px 1px 2px rgba(0,0,0,0.3);
   /* Override the .element-focusable height: auto */
-  height: 18px !important;
+  height: 28px !important;
   float: right; /* LTR */
   margin: 0;
   overflow: hidden;
   padding: 0 2px;
   position: relative;
-  width: 34px;
+  right: 2px;
+  width: 28px;
   text-indent: -9999px;
   z-index: 2;
 }
-.no-touch .contextual .trigger:hover,
 .contextual-links-active .trigger {
-  background-position: 2px -18px;
-}
-.contextual-links-active .trigger {
-  background-color: #fff;
-  border-bottom: none;
-  border-color: #d6d6d6;
+  border-radius: 14px 14px 0 0;
+  border-bottom: 1px solid transparent;
+  box-shadow: 2px 0 0 rgba(0,0,0,0.15);
 }
 
 /**
@@ -50,13 +49,15 @@
  */
 .contextual .contextual-links {
   background-color: #fff;
-  border: 1px solid #d6d6d6;
-  border-radius: 4px 0 4px 4px; /* LTR */
+  border: 1px solid #ddd;
+  border-radius: 10px 0 10px 10px; /* LTR */
+  box-shadow: 1px 1px 2px rgba(0,0,0,0.3);
   clear: both;
   float: right; /* LTR */
   margin: 0;
   padding: 0.25em 0;
   position: relative;
+  right: 2px;
   text-align: left; /* LTR */
   top: -1px;
   white-space: nowrap;
@@ -73,10 +74,11 @@
   line-height: 100%;
 }
 .contextual-region .contextual .contextual-links a {
+  color: black !important;
   display: block;
   font-family: sans-serif;
   font-size: small;
-  line-height: 0.8em;
+  line-height: 1.8em;
   margin: 0.25em 0;
   padding: 0.4em 0.6em;
 }
@@ -89,5 +91,7 @@
   text-decoration: none;
 }
 .no-touch .contextual-region .contextual .contextual-links li a:hover {
-  background-color: #bfdcee;
+  color: white;
+  background-image: -webkit-linear-gradient(rgb(78,159,234) 0%,rgb(65,126,210) 100%);
+  background-image: linear-gradient(rgb(78,159,234) 0%,rgb(65,126,210) 100%);
 }
diff --git a/core/modules/edit/css/edit.css b/core/modules/edit/css/edit.css
index 37e10eb..ce3d19e 100644
--- a/core/modules/edit/css/edit.css
+++ b/core/modules/edit/css/edit.css
@@ -1,4 +1,32 @@
 /**
+ * Pencil icon.
+ */
+.edit-toolbar-container .pencil {
+  background: #fff url(../../../misc/edit.png) no-repeat center center;
+  background-size: 16px 16px;
+  border: 1px solid #ddd;
+  border-radius: 13px;
+  -moz-box-shadow: 1px 1px 2px rgba(0,0,0,0.3);
+  -webkit-box-shadow: 1px 1px 2px rgba(0,0,0,0.3);
+  box-shadow: 1px 1px 2px rgba(0,0,0,0.3);
+  height: 26px;
+  width: 26px;
+  margin: 0;
+  outline: none;
+  overflow: hidden;
+  padding:0;
+  text-indent: 34px;
+  position: absolute;
+  right: 2px; /* LTR */
+  top: 2px;
+}
+
+.edit-toolbar-container.edit-editing .pencil {
+  display: none;
+}
+
+
+/**
  * Animations.
  */
 .edit-animate-invisible {
@@ -75,10 +103,10 @@
  * Toolbar.
  */
 .icon-edit:before {
-  background-image: url("../images/icon-edit.png");
+  background-image: url("../../../misc/edit.png");
 }
 .icon-edit:active:before,
-.active .icon-edit:before {
+.active.icon-edit:before {
   background-image: url("../images/icon-edit-active.png");
 }
 .toolbar .tray.edit.active {
@@ -106,8 +134,6 @@
   z-index: 250;
   width: 100%;
   height: 100%;
-  background-color: #fff;
-  background-color: rgba(255,255,255,.5);
   top: 0;
   left: 0;
 }
@@ -122,11 +148,18 @@
 }
 .edit-field.edit-editable,
 .edit-field .edit-editable {
-  box-shadow: 0 0 1px 1px #4d9de9;
+  /**
+   * In the latest design, there's no need to indicate candidates, since they
+   * now use pencil icons.
+   * This will probably be necessary again before release.
+   */
 }
 
 /* Highlighted (hovered) editable. */
 .edit-editable.edit-highlighted {
+  z-index: 305;
+}
+.edit-editable.edit-highlighted {
   min-width: 200px;
 }
 .edit-field.edit-editable.edit-highlighted,
@@ -279,6 +312,10 @@
   bottom: 1px;
   box-shadow: 0 0 1px 1px #0199ff, 0 0 3px 3px rgba(153, 153, 153, .5);
   background: #fff;
+  display: none;
+}
+.edit-highlighted .edit-toolbar-heightfaker {
+  display: block;
 }
 
 /* The toolbar; these are not necessarily visible. */
diff --git a/core/modules/edit/images/icon-edit-active.png b/core/modules/edit/images/icon-edit-active.png
index ad847612de18d0d60e59026155697d0288313803..a9143aa98c3711973865fe8b538eab31258a2b3e 100644
GIT binary patch
literal 515
zcmV+e0{s1nP)<h;3K|Lk000e1NJLTq000;O000*V1^@s65h0H)0005XNkl<Zc-pPg
z+imJl5QX7g!jwP>DS;9w!6i@t7f0NcNLWA;gt!c%0ZK>#JnRxEfez;UmK-#2e27n!
zC4G|F_MWAAAedSB%6`9p3crxk>2!6CswOaK_>UY82SElaT#()rY`5Ddm{YlgtpyQw
zC%xHVy<RKKd04XB?F0%bM3{4N1%#|tD}_0wC7aDg5MhWAf96QI&vLm`m_y0Urh*7_
zBIN#^+u$}IA0G;HwAfG(VI?A@5RnxH<#~I1Q<#%))_^?_AzxfUdFJ!E!W?~ne@|c!
zsQ({)o7rrpFh>`QMFJ}kA(aalCTL_?rZ6WjO<+!h1X8JhA%X})GM!Ep=4gHnLxcoU
zsesFZ2y>Fx*H?u(d1(U@NTmWU2_mdS^78VcFh>KaT)>4-*aOLAGEtbLl?wQ<27?<?
zsy-f%73S!-1*6eOaW0<guoBln!{Jb2j{dV?Fc=6fXu99IBdnm|F8zLAVUCs-^m@G}
zE)aJnNMX1i?(Zth(Z33wpP$dr;<<(l7Z|eeP4c@iN3R8Gn$}^+^9jQlO-QJiZnvv2
zM?;=Yr*niAj;MzprrmBUtPn%1)vDo)6t(aRVU8j~{s8GuE2@2?GdBPL002ovPDHLk
FV1j+y*gF6K

literal 358
zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)62?0JKuK)i1dkF^r|NnpW>ebt~
zZ(qND{pr)E7cX7_MSyIe<c}Xee*XLkWCInvd-v}B`}e<p|Niys*H<tAngrAZ6bGsV
ziUW0h`0(NL=g&Y%pvLGWokBnr;w3?T!S@~BD+Czq-+$j=eM3Rl{Dk@E&(A+Ez~D0N
z*i4|3d7dtgAr-e$&zux$RuFLsoMdr+#d^Ux|NiTLc4Bqe8M@c9TdX2%+gWzO?b_E}
zV!GzrSIlyFyi2MuJlSp0MT>90$^~C#CeJ?-ymO|4Q}4`AhmXFR@vPRq%sMP>xn9_D
zmAzg~={t8u*naokcVk;u!A2Q_2)Tyt;HgTPQ-jtpmJ7u!vug3#_58Qb=C+vE%j#ag
nYqb`S5;tWme^)wH;T5;3tLB#pJ|7!^E@kj^^>bP0l+XkKE~LX>

diff --git a/core/modules/edit/images/icon-edit.png b/core/modules/edit/images/icon-edit.png
deleted file mode 100644
index 4f0dcc2367e114713beec8b8357fd54b558a9e22..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 498
zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)62LgOTTn`*Luy*a*9XocMIdf+B
z?%lIz&pvhP)T&jhfZT-(7XrySbLIdQtXZ>W#flY6mo7bh`t$-Y07~uMyBA0<Uc4Bn
z^3b6}d-m*^H*X$L*`h^@=FguGB)4qYa_rc#g9i^TS+WFZ=JDglw{PFRY}v968#Zj-
zycsACbOq2xpe~@vKy!cw1JxWodKBmepgBOpfyM$g0v)+;-#(xlHg4RwZQHh;J9h$2
zUcY`l(7{m~HBy15XqN=}1)rb4Utxa2{qqeD{p<H9^q)6)Utlo5AVJ{#`TGU|4fD?f
z<>${oKmWXd0K=TW$(MoJwt2cZhE&{2JrT~-WFWwB@kVv{8V)XxO-e!=um8S(YO4<0
z%>9)-|6Yq!OL`Pkc7GMRb0&X-{kB|zGyxW!bwRV7W&|Cp*mjuBiKoox>S1fOBR&t`
zeY_oTpno&JSK_>VL452<?_xAUlJf3oG&38PpP$n0_2!=Dm5%J?uU-aonLcV_z4mWv
ztMEq)nZrxu+8#26#F;S6ULPR(?zdEf+4toF$+dT{MZeDEd}Q-!&%}Gn)z9f_3wwNF
Znf){1%_=)VZ=eqtJYD@<);T3K0RUvG215V<

diff --git a/core/modules/edit/js/createjs/editingWidgets/drupalcontenteditablewidget.js b/core/modules/edit/js/createjs/editingWidgets/drupalcontenteditablewidget.js
index 5671f39..caac604 100644
--- a/core/modules/edit/js/createjs/editingWidgets/drupalcontenteditablewidget.js
+++ b/core/modules/edit/js/createjs/editingWidgets/drupalcontenteditablewidget.js
@@ -29,13 +29,6 @@
     _initialize: function() {
       var that = this;
 
-      // Sets the state to 'activated' upon clicking the element.
-      this.element.on("click.edit", function(event) {
-        event.stopPropagation();
-        event.preventDefault();
-        that.options.activated();
-      });
-
       // Sets the state to 'changed' whenever the content has changed.
       var before = jQuery.trim(this.element.text());
       this.element.on('keyup paste', function (event) {
@@ -68,6 +61,7 @@
         case 'highlighted':
           break;
         case 'activating':
+          this.options.activated();
           break;
         case 'active':
           // Sets the "contenteditable" attribute to "true".
diff --git a/core/modules/edit/js/createjs/editingWidgets/formwidget.js b/core/modules/edit/js/createjs/editingWidgets/formwidget.js
index 3238566..ac89857 100644
--- a/core/modules/edit/js/createjs/editingWidgets/formwidget.js
+++ b/core/modules/edit/js/createjs/editingWidgets/formwidget.js
@@ -29,15 +29,7 @@
     /**
      * Implements Create's _initialize() method.
      */
-    _initialize: function() {
-      // Sets the state to 'activating' upon clicking the element.
-      var that = this;
-      this.element.on("click.edit", function(event) {
-        event.stopPropagation();
-        event.preventDefault();
-        that.options.activating();
-      });
-    },
+    _initialize: function() {},
 
     /**
      * Makes this PropertyEditor widget react to state changes.
diff --git a/core/modules/edit/js/views/menu-view.js b/core/modules/edit/js/views/menu-view.js
index ac7c4e4..0f9ecc8 100644
--- a/core/modules/edit/js/views/menu-view.js
+++ b/core/modules/edit/js/views/menu-view.js
@@ -64,6 +64,8 @@ Drupal.edit.views.MenuView = Backbone.View.extend({
         Drupal.toolbar.setHeight();
       }
     }
+    // Let other modules respond to the edit mode change.
+    $(document).trigger('drupalEditMode', {'editable': !isViewing});
   },
   /**
    * Handles clicks on the edit tab of the toolbar.
diff --git a/core/modules/edit/js/views/propertyeditordecoration-view.js b/core/modules/edit/js/views/propertyeditordecoration-view.js
index 0eb4e45..aabd72c 100644
--- a/core/modules/edit/js/views/propertyeditordecoration-view.js
+++ b/core/modules/edit/js/views/propertyeditordecoration-view.js
@@ -17,8 +17,6 @@ Drupal.edit.views.PropertyEditorDecorationView = Backbone.View.extend({
   _widthAttributeIsEmpty: null,
 
   events: {
-    'mouseenter.edit' : 'onMouseEnter',
-    'mouseleave.edit' : 'onMouseLeave',
     'tabIn.edit': 'onMouseEnter',
     'tabOut.edit': 'onMouseLeave'
   },
diff --git a/core/modules/edit/js/views/toolbar-view.js b/core/modules/edit/js/views/toolbar-view.js
index 90f5db7..41e15ad 100644
--- a/core/modules/edit/js/views/toolbar-view.js
+++ b/core/modules/edit/js/views/toolbar-view.js
@@ -29,7 +29,10 @@ Drupal.edit.views.ToolbarView = Backbone.View.extend({
     'click.edit button.label': 'onClickInfoLabel',
     'mouseleave.edit': 'onMouseLeave',
     'click.edit button.field-save': 'onClickSave',
-    'click.edit button.field-close': 'onClickClose'
+    'click.edit button.field-close': 'onClickClose',
+    'mouseenter .pencil': 'onPencilMouseEnter',
+    'mouseleave .pencil': 'onPencilMouseLeave',
+    'click .pencil': 'onPencilClick'
   },
 
   /**
@@ -66,19 +69,26 @@ Drupal.edit.views.ToolbarView = Backbone.View.extend({
   stateChange: function(from, to) {
     switch (to) {
       case 'inactive':
-        // Nothing happens in this stage.
+        if (from) {
+          this.remove();
+        }
         break;
       case 'candidate':
-        if (from !== 'inactive') {
+        if (from === 'inactive') {
+          this.render();
+        }
+        else {
+          // Remove all toolgroups; they're no longer necessary.
+          this.$el
+            .removeClass('edit-highlighted edit-editing')
+            .find('.edit-toolbar .edit-toolgroup').remove();
           if (from !== 'highlighted' && this.getEditUISetting('padding')) {
             this._unpad();
           }
-          this.remove();
         }
         break;
       case 'highlighted':
         // As soon as we highlight, make sure we have a toolbar in the DOM (with at least a title).
-        this.render();
         this.startHighlight();
         break;
       case 'activating':
@@ -275,6 +285,7 @@ Drupal.edit.views.ToolbarView = Backbone.View.extend({
     }
 
     this.$el
+      .addClass('edit-highlighted')
       .find('.edit-toolbar')
       // Append the "info" toolgroup into the toolbar.
       .append(Drupal.theme('editToolgroup', {
@@ -395,6 +406,10 @@ Drupal.edit.views.ToolbarView = Backbone.View.extend({
       this.$el.insertBefore(this.editor.element);
     }
 
+    // @todo: replace "Edit" with a proper (ARIA-like) string.
+    // @todo: <a> -> <button>
+    this.$el.append('<a class="pencil" href="#">Edit</a>');
+
     var that = this;
     // Animate the toolbar into visibility.
     setTimeout(function () {
@@ -421,6 +436,27 @@ Drupal.edit.views.ToolbarView = Backbone.View.extend({
       });
   },
 
+  onPencilMouseEnter: function (event) {
+    var editableEntity = this.editor.options.widget;
+    editableEntity.setState('highlighted', this.predicate);
+    event.stopPropagation();
+  },
+
+  onPencilMouseLeave: function (event) {
+    var editableEntity = this.editor.options.widget;
+    if (editableEntity.getState() === 'highlighted') {
+      editableEntity.setState('candidate', this.predicate);
+      event.stopPropagation();
+    }
+  },
+
+  onPencilClick: function (event) {
+    var editableEntity = this.editor.options.widget;
+    editableEntity.setState('activating', this.predicate);
+    event.preventDefault();
+    event.stopPropagation();
+  },
+
   /**
    * Retrieves the ID for this toolbar's container.
    *
diff --git a/core/misc/edit.png b/core/misc/edit.png
new file mode 100644
index 0000000..d176245
--- /dev/null
+++ b/core/misc/edit.png
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         !-  #IDATxڵ́@EєKH)%XHDDĀ(Fl,ᗐۻ0BI>80LҿfPԠȾjpŰG.E4־kdpa:Ǐǣ79Bp08OTYv;C	n8!C	fcp(#=^Uu%_V9T{l\Vy/X,
E{n>Zwf5x@EQ 
t:C[L&9jȳ/$UW5    IENDB`
\ No newline at end of file
