diff --git a/externs/olx.js b/externs/olx.js
index c00a799af6..0b9924c79b 100644
--- a/externs/olx.js
+++ b/externs/olx.js
@@ -4980,7 +4980,8 @@ olx.source.ServerVectorOptions.prototype.projection;
/**
- * @typedef {{crossOrigin: (null|string|undefined),
+ * @typedef {{attributions: (Array.
|undefined),
+ * crossOrigin: (null|string|undefined),
* tileLoadFunction: (ol.TileLoadFunctionType|undefined),
* url: string,
* wrapX: (boolean|undefined)}}
@@ -4989,6 +4990,16 @@ olx.source.ServerVectorOptions.prototype.projection;
olx.source.TileJSONOptions;
+/**
+ * Optional attributions for the source. If provided, these will be used
+ * instead of any attribution data advertised by the server. If not provided,
+ * any attributions advertised by the server will be used.
+ * @type {Array.|undefined}
+ * @api stable
+ */
+olx.source.TileJSONOptions.prototype.attributions;
+
+
/**
* The `crossOrigin` attribute for loaded images. Note that you must provide a
* `crossOrigin` value if you are using the WebGL renderer or if you want to
diff --git a/src/ol/source/tilejsonsource.js b/src/ol/source/tilejsonsource.js
index 92982e18fc..4246908224 100644
--- a/src/ol/source/tilejsonsource.js
+++ b/src/ol/source/tilejsonsource.js
@@ -33,6 +33,7 @@ goog.require('ol.tilegrid.XYZ');
ol.source.TileJSON = function(options) {
goog.base(this, {
+ attributions: options.attributions,
crossOrigin: options.crossOrigin,
projection: ol.proj.get('EPSG:3857'),
state: ol.source.State.LOADING,
@@ -87,7 +88,8 @@ ol.source.TileJSON.prototype.handleTileJSONResponse = function(tileJSON) {
}),
ol.TileUrlFunction.createFromTemplates(tileJSON.tiles));
- if (goog.isDef(tileJSON.attribution)) {
+ if (goog.isDef(tileJSON.attribution) &&
+ goog.isNull(this.getAttributions())) {
var attributionExtent = goog.isDef(extent) ?
extent : epsg4326Projection.getExtent();
/** @type {Object.>} */