diff --git a/core/includes/batch.inc b/core/includes/batch.inc
index 27fb632..569ce58 100644
--- a/core/includes/batch.inc
+++ b/core/includes/batch.inc
@@ -86,9 +86,9 @@ function _batch_page() {
  */
 function _batch_do() {
   // Perform actual processing.
-  list($percentage, $message) = _batch_process();
+  list($percentage, $message, $label) = _batch_process();
 
-  return new JsonResponse(array('status' => TRUE, 'percentage' => $percentage, 'message' => $message));
+  return new JsonResponse(array('status' => TRUE, 'percentage' => $percentage, 'message' => $message, 'label' => $label));
 }
 
 /**
@@ -108,6 +108,7 @@ function _batch_progress_page() {
     // This is the first page so we return some output immediately.
     $percentage       = 0;
     $message          = $current_set['init_message'];
+    $label            = '';
     $batch['running'] = TRUE;
   }
   else {
@@ -128,7 +129,7 @@ function _batch_progress_page() {
     print $fallback;
 
     // Perform actual processing.
-    list($percentage, $message) = _batch_process($batch);
+    list($percentage, $message, $label) = _batch_process($batch);
     if ($percentage == 100) {
       $new_op = 'finished';
     }
@@ -166,7 +167,7 @@ function _batch_progress_page() {
   drupal_add_js($js_setting, 'setting');
   drupal_add_library('system', 'drupal.batch');
 
-  return theme('progress_bar', array('percent' => $percentage, 'message' => $message));
+  return theme('progress_bar', array('percent' => $percentage, 'message' => $message, 'label' => $label));
 }
 
 /**
@@ -208,7 +209,7 @@ function _batch_process() {
       include_once DRUPAL_ROOT . '/' . $current_set['file'];
     }
 
-    $task_message = '';
+    $task_message = $label = '';
     // Assume a single pass operation and set the completion level to 1 by
     // default.
     $finished = 1;
@@ -296,14 +297,11 @@ function _batch_process() {
       '@estimate'   => ($current > 0) ? format_interval(($elapsed * ($total - $current) / $current) / 1000) : '-',
     );
     $message = strtr($progress_message, $values);
-    if (!empty($message)) {
-      $message .= '<br />';
-    }
     if (!empty($task_message)) {
-      $message .= $task_message;
+      $label = $task_message;
     }
 
-    return array($percentage, $message);
+    return array($percentage, $message, $label);
   }
   else {
     // If we are not in progressive mode, the entire batch has been processed.
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 2a2de1f..7f45fe5 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2384,9 +2384,10 @@ function theme_more_link($variables) {
  */
 function theme_progress_bar($variables) {
   $output = '<div id="progress" class="progress">';
-  $output .= '<div class="bar"><div class="filled" style="width: ' . $variables['percent'] . '%"></div></div>';
-  $output .= '<div class="percentage">' . $variables['percent'] . '%</div>';
-  $output .= '<div class="message">' . $variables['message'] . '</div>';
+  $output .= '<div class="progress__label">' . $variables['label'] . '</div>';
+  $output .= '<div class="progress__track"><div class="progress__bar" style="width: ' . $variables['percent'] . '%"></div></div>';
+  $output .= '<div class="progress__percentage">' . $variables['percent'] . '%</div>';
+  $output .= '<div class="progress__description">' . $variables['message'] . '</div>';
   $output .= '</div>';
 
   return $output;
diff --git a/core/misc/progress.gif b/core/misc/progress.gif
deleted file mode 100644
index f84a9de..0000000
--- a/core/misc/progress.gif
+++ /dev/null
@@ -1,32 +0,0 @@
-GIF89a (   hgfedca`^][`Z`__X^^]V]\U\[SYRYQXXPVVOU[ZZNUYYSSXXWQVWQPPUTTNNSMRMQPKKJJONIINHMGGLFKFJIHGFFEEDCBAAA@@                                                                                 !NETSCAPE2.0   !  d ,     (  (&(& +'+'0,0,1/1/34349898=:=:?  ABBAB"#" 1B$G&D"A	!(ɒPEG-ZXldI)5ȨRHBfMnй5GaU\ WejWY@dHYDh	6[.F812n"\pɻ%(<8I.+_|쥲d&Od0c>	(S2EL1~%Ŕ͝=Mz̏Dl&>9`/\tIVK[aǖ=KWZ
-DkӧB5tR@ϙ&J-aFyH"-B=Dq>@tO>#|:@9t c7߈c6d4020cL1",b.1"J(DP)HB%h
- !  d ,     (   dd&('+dd,0d/1d43d89d:=d??d#ABdȚGHd	%%KMd
---PRd22TTd77UVd<<WXd>>YЈH[ШHH](IM_ȄhĄ&/dH4zD1)M)H$M	ǌYqb".LdPSiʷ/=MӔnTp%2MD"EVZe͐%kDX`%xj+-[bEbQHL5
-ӧK"葦I  !  d ,     (   dd(+0d139=? #B"%H*	M.
--R52T67V;<X@>ZCD\FE]JI_L!LcN$tҔNb 6ɾN%o^#x5RW\#r5m[#lӪ5왱FȔ5biX1`zeV.ZbreiU+TJeSM0ijT	$FY
- !  d ,     (  ( dd+0d139=? #B"%H*	-M.
-R52T67V;<X@>ZCD\FE]JI_L!LcN$\%E)4F#~ *o#x9RW#r9m#lӪ9v4E.%[LѰb.ҭ\.ŚҪV.:%ҧP8EDɑH+E) !  d ,     (  d( dd+0d139=? #B"%H*	-M.
-2R5T67V;<X@>ZCD\FE]JI_L!LcN$&=$&JISIO_A'O	O-ZgrAl][,4ieRlLČM[خLt$֫L\d
-$RBqiJ25zI@ !  d ,     (  dd( +0d139=? #B"%H*	-M.
-2R57T6V;<X@>ZCD\FE]JI_L!LcN$&=$&JISO?PR<vFԁ:nQ9p }Ӵ"ja[L4iiRl0MČ-lp骥IWXjҩQJMɓJ e$I !  d ,     (  d( +0d1d39=? #B"%H*	-M.
-2R57T6<V;X@>ZCD\FE]JI_L!LcN$&=$&JISO?yr/t֙B.Tqim5Mְ-r	E4)cH&b"[pHWZ
-ҌQ4q	ԤJ e$I !  d ,     (  dd( +0d13d9=? #B"%H*	-M.
-2R57T6<V;>X@ZCD\FE]JI_L!LcN$&=$&JISO?ys:u$my[DM5li&m2Mʘ-E4Ȗ&\4UE9P
-5&N TL=$iP  !  d ,     (  d( +0d139d=? #B"%H*	-M.
-2R57T6<V;>X@DZC\FE]JI_L!LcN$&=$&JISO?yijRIԕ5n8MXe۶c5Mְ-r	E4)cH&bآ[rZKSWXJ(RLM	I.A4#H !  d ,     (  d( +0d139= d?#B"%H*	-M.
-2R57T6<V;>X@DZCE\F]JI_L!LcN$&=$&JISO?MA7uЩ+IoMҦ
-ilLr	E4)cH&bkע[~Ђ$+HNd*Ԩx8yjRK2Mj$2  !  d ,     (  dd( +dd0139=? "#dB	%H*-M.
-2R57T6<V;>X@DZCE\FI]J_L!LcN$"=$&JHSH)>F"ѳ;x(SW8r(q׵H(QYcɖ1FXD(	׬ZdzňթTLԦNYHS$GM
- !  d ,     (  d( +dd0139=? B"#*	%dH
--M.2R57T6<V;>X@DZCE\FI]JL_L!đcN$"=$&JHS(h`$}Qg/%wQB%qQ-%kئ1F(-F	0FrbkV-FZbT*FBbjS'F(Y/#H !  d ,     (  d( +dd0139=? B"#H*	%.
--dM2R57T6<V;>X@DZCE\FI]JL_L!OcNH($&JHS(؏>~(ѳ;x(SW8r(q󖍒5lE֌3JƐ)k"_*z)+YjS
-5Mid	SIAb !  d ,     (  d( d+d0139=? B"#H*	%M.
--52dR7T6<V;>X@DZCE\FI]JL_L!OcN$My&&Jg7)>{Ճ7;uΥ#7)8ou[5i11cȞɮEplV-EXZE@ZIE&UH$G !  d ,     (  dd( +0139=? B"#H*	%M.
--R5267dT<V;>X@DZCE\FI]JL_L!OcNH8bML6I{ًGuЩ+GI9G&uh$*Ҩ-kرd5!"5W:ʑPɑ&J0-jD	$C  !  d ,     (  dd( +0d139=? B"#H*	%M.
--R52T67;<V>X@DZCE\FI]JL_L!OcNH8ILoߦJ:M92Wi7G*YɶM5k̜A3L0atM?b9jMV-:%P:}ZDIӥLi$P  !  d ,     (  ހd( +0139=? B"#H*	%M.
--R52T67V;<@>XDZCE\FI]JL_L!OcNH8JLo_yBUrJ9:W	˷pشqF3gЌ!SL1]|Ѳ+,Yzr
-UEDE8]ʴ'H !  d ,     (  ހdd( d+0d139=? B"#H*	%M.
--R52T67V;<X@>CDZE\FI]JL_L!Oc`4()O?F,ջwȝ%xPbݷpm6ڵfϢK,ذbzu+׫X:j))Q,<dSC,atȑH !  d ,     (  d( d+0d139=? B"#H*	%M.
--R52T67V;<X@>ZCDFE\I]JL_L!Oc`4()(}ѳdOޡwc9WcD6n=fGΠ12F	##^{d#]bͲN4#ԦNUI!G"M
- !  d ,     (  d( d+0d139=? B"#H*	%M.
--R52T67V;<X@>ZCD\FEJI]!L_Oc`4()Ȩ#~ճE#x1RW#rb#oYc3h=BG12/Fje),WVBe)Q@=d)&J0=rd)R@ ;
\ No newline at end of file
diff --git a/core/misc/progress.js b/core/misc/progress.js
index 922fea5..e3e000f 100644
--- a/core/misc/progress.js
+++ b/core/misc/progress.js
@@ -21,21 +21,23 @@ Drupal.ProgressBar = function (id, updateCallback, method, errorCallback) {
   // The WAI-ARIA setting aria-live="polite" will announce changes after users
   // have completed their current activity and not interrupt the screen reader.
   this.element = $('<div class="progress" aria-live="polite"></div>').attr('id', id);
-  this.element.html('<div class="bar"><div class="filled"></div></div>' +
-                    '<div class="percentage"></div>' +
-                    '<div class="message">&nbsp;</div>');
+  this.element.html('<div class="progress__label">&nbsp;</div>' +
+                    '<div class="progress__track"><div class="progress__bar"></div></div>' +
+                    '<div class="progress__percentage"></div>' +
+                    '<div class="progress__description">&nbsp;</div>');
 };
 
 $.extend(Drupal.ProgressBar.prototype, {
   /**
    * Set the percentage and status message for the progressbar.
    */
-  setProgress: function (percentage, message) {
+  setProgress: function (percentage, message, label) {
     if (percentage >= 0 && percentage <= 100) {
-      $(this.element).find('div.filled').css('width', percentage + '%');
-      $(this.element).find('div.percentage').html(percentage + '%');
+      $(this.element).find('div.progress__bar').css('width', percentage + '%');
+      $(this.element).find('div.progress__percentage').html(percentage + '%');
     }
-    $('div.message', this.element).html(message);
+    $('div.progress__description', this.element).html(message);
+    $('div.progress__label', this.element).html(label);
     if (this.updateCallback) {
       this.updateCallback(percentage, message, this);
     }
@@ -82,7 +84,7 @@ $.extend(Drupal.ProgressBar.prototype, {
             return;
           }
           // Update display.
-          pb.setProgress(progress.percentage, progress.message);
+          pb.setProgress(progress.percentage, progress.message, progress.label);
           // Schedule next timer.
           pb.timer = setTimeout(function () { pb.sendPing(); }, pb.delay);
         },
diff --git a/core/modules/system/css/system.module.css b/core/modules/system/css/system.module.css
index 006d6d7..6f33ee8 100644
--- a/core/modules/system/css/system.module.css
+++ b/core/modules/system/css/system.module.css
@@ -186,25 +186,50 @@ table.sticky-header {
  *
  * @see progress.js
  */
-/* Bar */
-.progress .bar {
+.progress {
+  position: relative;
+}
+.progress__track {
   background-color: #fff;
   border: 1px solid;
+  margin-top: 5px;
+  max-width: 100%;
+  min-width: 100px;
+  height: 16px;
+  background-color: #fff;
 }
-.progress .filled {
+.progress__bar {
   background-color: #000;
   height: 1.5em;
-  width: 5px;
+  width: 3%;
+}
+.progress__description,
+.progress__percentage {
+  color: #555;
+  overflow: hidden;
+  font-size: .875em;
+  margin-top: 0.2em;
+}
+.progress__description {
+  float: left; /* LTR */
+}
+[dir="rtl"] .progress__description {
+  float: right;
 }
-.progress .percentage {
+.progress__percentage {
   float: right; /* LTR */
 }
-[dir="rtl"] .progress .percentage {
+[dir="rtl"] .progress__percentage {
   float: left;
 }
-[dir="rtl"] .progress-disabled {
-  float: right;
+.progress--small .progress__track {
+  height: 7px;
+}
+.progress--small .progress__bar {
+  height: 7px;
+  background-size: 20px 20px;
 }
+
 /* Throbber */
 .ajax-progress {
   display: inline-block;
diff --git a/core/modules/system/css/system.theme.css b/core/modules/system/css/system.theme.css
index dfb496b..d3c52a3 100644
--- a/core/modules/system/css/system.theme.css
+++ b/core/modules/system/css/system.theme.css
@@ -274,17 +274,91 @@ th.checkbox {
  *
  * @see progress.js
  */
-.progress {
-  font-weight: bold;
+.progress__track {
+  border-color: #b3b3b3;
+  border-radius: 10em;
+  background-color: #f2f1eb;
+  background-image: -webkit-linear-gradient(#e7e7df, #f0f0f0);
+  background-image:    -moz-linear-gradient(#e7e7df, #f0f0f0);
+  background-image:      -o-linear-gradient(#e7e7df, #f0f0f0);
+  background-image:         linear-gradient(#e7e7df, #f0f0f0);
+  box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.16);
+}
+.progress__bar {
+  border: 1px #07629a solid;
+  background: #057ec9;
+  background-image:
+    -webkit-linear-gradient( top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15) ),
+    -webkit-linear-gradient( left top,
+      #0094f0 0%,
+      #0094f0 25%,
+      #007ecc 25%,
+      #007ecc 50%,
+      #0094f0 50%,
+      #0094f0 75%,
+      #0094f0 100% );
+  background-image:
+    -moz-linear-gradient( top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15) ),
+    -moz-linear-gradient( left top,
+      #0094f0 0%,
+      #0094f0 25%,
+      #007ecc 25%,
+      #007ecc 50%,
+      #0094f0 50%,
+      #0094f0 75%,
+      #0094f0 100% );
+  background-image:
+    -o-linear-gradient( top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15) ),
+    -o-linear-gradient( left top,
+      #0094f0 0%,
+      #0094f0 25%,
+      #007ecc 25%,
+      #007ecc 50%,
+      #0094f0 50%,
+      #0094f0 75%,
+      #0094f0 100% );
+  background-image:
+    linear-gradient( to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15) ),
+    linear-gradient( to right bottom,
+      #0094f0 0%,
+      #0094f0 25%,
+      #007ecc 25%,
+      #007ecc 50%,
+      #0094f0 50%,
+      #0094f0 75%,
+      #0094f0 100% );
+  background-size: 40px 40px;
+  margin-top: -1px;
+  margin-left: -1px;
+  padding: 0 1px;
+  height: 16px;
+  border-radius: 10em;
+  -webkit-animation: animate-stripes 3s linear infinite;
+  -moz-animation: animate-stripes 3s linear infinite;
+  -webkit-transition: width 0.5s ease-out;
+  -moz-transition: width 0.5s ease-out;
+  -ms-transition: width 0.5s ease-out;
+  -o-transition: width 0.5s ease-out;
+  transition: width 0.5s ease-out;
+}
+
+/**
+ * Progress bar animations.
+ */
+@-webkit-keyframes animate-stripes {
+  0% {background-position: 0 0, 0 0;} 100% {background-position: 0 0, -80px 0;}
+}
+@-moz-keyframes animate-stripes {
+  0% {background-position: 0 0, 0 0;} 100% {background-position: 0 0, -80px 0;}
+}
+@-o-keyframes animate-stripes {
+  0% {background-position: 0 0, 0 0;} 100% {background-position: 0 0, -80px 0;}
 }
-.progress .bar {
-  background: #ccc;
-  border-color: #666;
-  margin: 0 0.2em;
-  border-radius: 3px;
+@-ms-keyframes animate-stripes {
+  0% {background-position: 0 0, 0 0;} 100% {background-position: 0 0, -80px 0;}
 }
-.progress .filled {
-  background: #0072b9 url(../../../misc/progress.gif);
+@keyframes animate-stripes {
+  0% {background-position: 0 0, 0 0;} 100% {background-position: 0 0, -80px 0;}
 }
 
 /**
