diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8cab523..7c7f2e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.0
+
+* Add support for `HttpServer.defaultResponseHeaders`.
+
 ## 1.0.2
 
 * Remove the workaround for [issue 19815][].
diff --git a/lib/http_multi_server.dart b/lib/http_multi_server.dart
index 76c3eba..7075ab4 100644
--- a/lib/http_multi_server.dart
+++ b/lib/http_multi_server.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'src/multi_headers.dart';
 import 'src/utils.dart';
 
 /// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers
@@ -20,6 +21,11 @@
   /// The wrapped servers.
   final Set<HttpServer> _servers;
 
+  /// Returns the default value of the `Server` header for all responses
+  /// generated by each server.
+  ///
+  /// If the wrapped servers have different default values, it's not defined
+  /// which value is returned.
   String get serverHeader => _servers.first.serverHeader;
   set serverHeader(String value) {
     for (var server in _servers) {
@@ -27,8 +33,11 @@
     }
   }
 
-  HttpHeaders get defaultResponseHeaders =>
-      throw new UnsupportedError('defaultResponseHeaders not supported');
+  /// Returns the default set of headers added to all response objects.
+  ///
+  /// If the wrapped servers have different default headers, it's not defined
+  /// which header is returned for accessor methods.
+  final HttpHeaders defaultResponseHeaders;
 
   Duration get idleTimeout => _servers.first.idleTimeout;
   set idleTimeout(Duration value) {
@@ -61,6 +70,8 @@
   /// listened to when this is called.
   HttpMultiServer(Iterable<HttpServer> servers)
       : _servers = servers.toSet(),
+        defaultResponseHeaders = new MultiHeaders(
+            servers.map((server) => server.defaultResponseHeaders)),
         super(mergeStreams(servers));
 
   /// Creates an [HttpServer] listening on all available loopback addresses for
diff --git a/lib/src/multi_headers.dart b/lib/src/multi_headers.dart
new file mode 100644
index 0000000..1677a9f
--- /dev/null
+++ b/lib/src/multi_headers.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_multi_server.multi_headers;
+
+import 'dart:io';
+
+/// A class that delegates header access and setting to many [HttpHeaders]
+/// instances.
+class MultiHeaders implements HttpHeaders {
+  /// The wrapped headers.
+  final Set<HttpHeaders> _headers;
+
+  bool get chunkedTransferEncoding => _headers.first.chunkedTransferEncoding;
+  set chunkedTransferEncoding(bool value) {
+    for (var headers in _headers) {
+      headers.chunkedTransferEncoding = value;
+    }
+  }
+
+  int get contentLength => _headers.first.contentLength;
+  set contentLength(int value) {
+    for (var headers in _headers) {
+      headers.contentLength = value;
+    }
+  }
+
+  ContentType get contentType => _headers.first.contentType;
+  set contentType(ContentType value) {
+    for (var headers in _headers) {
+      headers.contentType = value;
+    }
+  }
+
+  DateTime get date => _headers.first.date;
+  set date(DateTime value) {
+    for (var headers in _headers) {
+      headers.date = value;
+    }
+  }
+
+  DateTime get expires => _headers.first.expires;
+  set expires(DateTime value) {
+    for (var headers in _headers) {
+      headers.expires = value;
+    }
+  }
+
+  String get host => _headers.first.host;
+  set host(String value) {
+    for (var headers in _headers) {
+      headers.host = value;
+    }
+  }
+
+  DateTime get ifModifiedSince => _headers.first.ifModifiedSince;
+  set ifModifiedSince(DateTime value) {
+    for (var headers in _headers) {
+      headers.ifModifiedSince = value;
+    }
+  }
+
+  bool get persistentConnection => _headers.first.persistentConnection;
+  set persistentConnection(bool value) {
+    for (var headers in _headers) {
+      headers.persistentConnection = value;
+    }
+  }
+
+  int get port => _headers.first.port;
+  set port(int value) {
+    for (var headers in _headers) {
+      headers.port = value;
+    }
+  }
+
+  MultiHeaders(Iterable<HttpHeaders> headers)
+      : _headers = headers.toSet();
+
+  void add(String name, Object value) {
+    for (var headers in _headers) {
+      headers.add(name, value);
+    }
+  }
+
+  void forEach(void f(String name, List<String> values)) =>
+      _headers.first.forEach(f);
+
+  void noFolding(String name) {
+    for (var headers in _headers) {
+      headers.noFolding(name);
+    }
+  }
+
+  void remove(String name, Object value) {
+    for (var headers in _headers) {
+      headers.remove(name);
+    }
+  }
+
+  void removeAll(String name) {
+    for (var headers in _headers) {
+      headers.removeAll(name, value);
+    }
+  }
+
+  void set(String name, Object value) {
+    for (var headers in _headers) {
+      headers.set(name, value);
+    }
+  }
+
+  String value(String name) => _headers.first.value(name);
+
+  List<String> operator[](String name) => _headers.first[name];
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index c7361d4..61e3dff 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_multi_server
-version: 1.0.2
+version: 1.1.0
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description:
diff --git a/test/http_multi_server_test.dart b/test/http_multi_server_test.dart
index a3d9062..0371c89 100644
--- a/test/http_multi_server_test.dart
+++ b/test/http_multi_server_test.dart
@@ -60,6 +60,28 @@
       }), completes);
     });
 
+    test("headers.set sets the value for all servers", () {
+      multiServer.defaultResponseHeaders.set(
+          "server", "http_multi_server test");
+
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_get(subServer1).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer2).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer3).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+    });
+
     test("connectionsInfo sums the values for all servers", () {
       var pendingRequests = 0;
       var awaitingResponseCompleter = new Completer();
