Add a custom cache layer

Provide your customers with a more consistent user experience by implementing a custom caching layer that optimizes the connection between your cloud infrastructure and the Akamai platform.

What you'll do

Create and activate a Cloud Wrapper configuration and link it to a property.

Currently, you can use Cloud Wrapper with these Akamai products:

  • Media delivery: Adaptive Media Delivery, Download Delivery, and Object Delivery.
  • Website delivery: Dynamic Site Accelerator and Ion.
📘

Support for Cloud Wrapper with Dynamic Site Accelerator and Ion is currently in limited-availability. To request access to these products, talk to your account representative.

What you need

To use a Cloud Wrapper configuration, you need a property from the Property Manager (PAPI) API, which is actively delivering your media or website content for at least 37 days. This helps ​Akamai​ determine your capacity needs.

Cloud Wrapper has a default object limit of 10,000 objects/GB.

1. Create a new wrapper configuration

Get your contract's property IDs and traffic locations and their storage capacity to create a new Cloud Wrapper configuration.

🚧

The properties you want to use Cloud Wrapper with must be activated on the production network.

  1. Determine which properties to use with your new configuration by running Get-CloudWrapperProperty. Optionally add the -Unused switch parameter to return only properties that aren't in use.

    Get-CloudWrapperProperty -ContractIds 'C-0N7RAC7'
     propertyId   : 12345
     propertyName : my-property-1
     contractId   : C-0N7RAC7
     groupId      : 23456
     type         : MEDIA
    
     propertyId   : 98765
     propertyName : my-property-2
     contractId   : C-0N7RAC7
     groupId      : 23456
     type         : WEB

    You need to provide property IDs when you create your Cloud Wrapper configuration.

  2. Get your contract's traffic location with Get-CloudWrapperLocation.

    Get-CloudWrapperLocation | Format-List
     locationId         : 1
     locationName       : US East
     trafficTypes       : {@{trafficTypeId=50; trafficType=WEB_STANDARD_TLS; mapName=cw-s-use}, @{trafficTypeId=1; 
                         trafficType=LIVE; mapName=cw-s-use-live}, @{trafficTypeId=2; trafficType=LIVE_VOD; mapName=cw-s-use}, 
                         @{trafficTypeId=100; trafficType=WEB_OPTIMIZED; mapName=cw-s-use-web}}
     multiCdnLocationId : 018
    
     locationId         : 2
     locationName       : US West
     trafficTypes       : {@{trafficTypeId=51; trafficType=WEB_STANDARD_TLS; mapName=cw-s-usw}, @{trafficTypeId=3; 
                         trafficType=LIVE_VOD; mapName=cw-s-usw}, @{trafficTypeId=4; trafficType=LIVE; mapName=cw-s-usw-live}, 
                         @{trafficTypeId=101; trafficType=WEB_OPTIMIZED; mapName=cw-s-usw-web}}
     multiCdnLocationId : 020

    The output returns an Akamai created trafficTypeId that represents a location and its traffic type combination. Use the values of this ID when creating the configuration.

  3. Find your location's capacity with Get-CloudWrapperCapacity.

    Get-CloudWrapperCapacity -ContractIds 'C-0N7RAC7'
     locationId         : 1
     locationName       : US East
     contractId         : C-0N7RAC7
     type               : MEDIA
     approvedCapacity   : @{value=100; unit=GB}
     assignedCapacity   : @{value=80; unit=GB}
     unassignedCapacity : @{value=20; unit=GB}
    
     locationId         : 3
     locationName       : Europe
     contractId         : C-0N7RAC7
     type               : WEB_STANDARD_TLS
     approvedCapacity   : @{value=1; unit=GB}
     assignedCapacity   : @{value=1; unit=GB}
     unassignedCapacity : @{value=0; unit=GB}

    The output returns a unit of measurement, either GB or TB.

    You also get the value for the unassignedCapacity. This value represents the difference between the approvedCapacity and assignedCapacity, giving you the total space you have left for a location.

    You need both the unit and a value within the limits of your approved capacity to create the wrapper configuration.

  4. Create a Cloud Wrapper configuration with New-CloudWrapperConfiguration. Provide each location in the locations array.

    Optionally, add the -Activate switch parameter to activate your configuration upon creation. Otherwise, you can activate it separately.

    For a full list of settings you need to pass in the operation, see Cloud Wrapper configuration.

    $MyConfig = @{
        locations = @(
            @{
                capacity = @{
                    unit = "GB"
                    value = 1
                }
                comments = "Real traffic"
                trafficTypeId = 3
            },
        ),
        capacityAlertsThreshold = 50
        comments = "Real traffic"
        configName = "my-config"
        contractId = "C-0N7RAC7"
        propertyIds = @(
            "12345"
        )
        notificationEmails = @(
            "jsmith@example.com"
        )
    }
    
    $MyConfig | New-CloudWrapperConfiguration
    $MyConfig = '{
        "locations": [
            {
                "capacity": {
                    "unit": "GB",
                    "value": 1
                },
                "comments": "Real traffic",
                "trafficTypeId": 2
            },
        ],
        "capacityAlertsThreshold": 80,
        "comments": "Real traffic",
        "configName": "my-config",
        "contractId": "C-0N7RAC7",
        "propertyIds": [
            "12345"
        ],
        "notificationEmails": [
            "jsmith@example.com"
        ]
    }'
    
    $MyConfig | New-CloudWrapperConfiguration
    configId                : 54321
    configName              : my-config
    contractId              : C-0N7RAC7
    propertyIds             : {12345}
    comments                : Real traffic
    status                  : IN_PROGRESS
    retainIdleObjects       : False
    locations               : {@{trafficTypeId=3; comments=Real traffic; capacity=; mapName=cw-s-usw}}
    multiCdnSettings        : 
    capacityAlertsThreshold : 50
    notificationEmails      : {jsmith@example.com}
    lastUpdatedDate         : 3/31/2026 9:39:33 AM
    lastUpdatedBy           : jsmith
    lastActivatedDate       : 
    lastActivatedBy         : 

Manage a configuration

Update a configuration

For a full list of settings you need to pass in the update operation, see Cloud Wrapper configuration.

You can update your Cloud Wrapper configuration using one of these ways:

Method 1

Save the results of the Get-CloudWrapperConfiguration command in a variable and update specific attributes of your configuration. Then pipe the entire object back to the Set-CloudWrapperConfiguration command to make your changes effective.

$MyConfig = Get-CloudWrapperConfiguration -ConfigID 54321

$MyConfig.locations[0].trafficTypeId = 1
$MyConfig.locations[0].capacity.value = 3
$MyConfig.propertyIds += "98765"
$MyConfig.notificationEmails = @("jsmith@example.com", "jasmith@example.com")
$MyConfig.capacityAlertsThreshold = 80

$MyConfig | Set-CloudWrapperConfiguration -ConfigID 54321
configId                : 54321
configName              : my-config
contractId              : C-0N7RAC7
propertyIds             : {12345, 98765}
comments                : Real traffic
status                  : SAVED
retainIdleObjects       : False
locations               : {@{trafficTypeId=1; comments=Real traffic; capacity=; mapName=cw-s-use}}
multiCdnSettings        : 
capacityAlertsThreshold : 80
notificationEmails      : {jsmith@example.com, jasmith@example.com}
lastUpdatedDate         : 3/31/2026 10:09:33 AM
lastUpdatedBy           : jsmith
lastActivatedDate       : 
lastActivatedBy         : 

Method 2

Retrieve your configuration with Get-CloudWrapperConfiguration, save its output locally, and edit it as needed.

Get-CloudWrapperConfiguration -ConfigID 54321 | ConvertTo-Json -Depth 100 | Out-File -FilePath ./myConfig.json
{
  "configId": 54321,
  "configName": "my-config",
  "contractId": "C-0N7RAC7",
  "propertyIds": [
    "12345"
  ],
  "comments": "Real traffic",
  "status": "SAVED",
  "retainIdleObjects": false,
  "locations": [
    {
      "trafficTypeId": 3,
      "comments": "Real traffic",
      "capacity": {
        "value": 1,
        "unit": "GB"
      },
      "mapName": "cw-s-usw"
    }
  ],
  "multiCdnSettings": null,
  "capacityAlertsThreshold": 50,
  "notificationEmails": [
    "jsmith@example.com"
  ],
  "lastUpdatedDate": "2026-03-31T10:09:33.474Z",
  "lastUpdatedBy": "jsmith",
  "lastActivatedDate": null,
  "lastActivatedBy": null
}

Then pipe the updated content to the Set-CloudWrapperConfiguration command along with the required ID.

$MyConfig = Get-Content ./myConfig.json -Raw

$MyConfig | Set-CloudWrapperConfiguration -ConfigID 54321

When updating the configuration with Set-CloudWrapperConfiguration, optionally add the -Activate switch parameter to activate it.

Delete a configuration

Before deleting a configuration, ensure that all the properties that use it have the Cloud Wrapper behavior disabled. To do that, run the Set-CloudWrapperConfiguration operation with the -Deactivate switch to deactivate it.

Once you disable the Cloud Wrapper, run Remove-CloudWrapperConfiguration to proceed with the delete.

The delete can take up to three hours to complete.

Remove-CloudWrapperConfiguration -ConfigID 54321

The operation doesn't return any output.

Pass your configuration's ID in the Get-CloudWrapperConfiguration operation to review its deletion status.

Get-CloudWrapperConfiguration -ConfigID 54321
configId                : 54321
configName              : my-config
contractId              : C-0N7RAC7
propertyIds             : {12345, 98765}
comments                : Real traffic
status                  : DELETE_IN_PROGRESS
retainIdleObjects       : False
locations               : {@{trafficTypeId=1; comments=; capacity=; mapName=cw-s-use}}
multiCdnSettings        : 
capacityAlertsThreshold : 80
notificationEmails      : {jsmith@example.com, jasmith@example.com}
lastUpdatedDate         : 3/31/2026 5:50:26 PM
lastUpdatedBy           : jsmith
lastActivatedDate       : 
lastActivatedBy         : 

2. Activate a wrapper configuration

If you haven't activated your configuration upon creation, you can activate it separately with New-CloudWrapperConfigurationActivation by passing your Cloud Wrapper's configuration ID. Activating the configuration makes it available for your property.

📘

Activation processing takes 3–4 hours.

New-CloudWrapperConfigurationActivation -ConfigurationIDs 54321

The operation doesn't return any output.

You can use your configuration's ID to run the Get-CloudWrapperConfiguration operation and review its status.

Get-CloudWrapperConfiguration -ConfigID 54321
configId                : 54321
configName              : my-config
contractId              : C-0N7RAC7
propertyIds             : {12345}
comments                : Real traffic
status                  : ACTIVE
retainIdleObjects       : False
locations               : {@{trafficTypeId=3; comments=; capacity=; mapName=cw-s-usw}}
multiCdnSettings        : 
capacityAlertsThreshold : 50
notificationEmails      : {jsmith@example.com}
lastUpdatedDate         : 3/31/2026 4:59:46 PM
lastUpdatedBy           : jsmith
lastActivatedDate       : 4/01/2026 6:14:37 PM
lastActivatedBy         : jsmith

You can make changes to your configuration while its activation is in progress. However, those changes won’t be included automatically. To apply them, run the activation again.

3. Configure property rules

Once your configuration is active, link it to your property.

  1. Get your property's rule tree as JSON snippets. The output is a directory at your current location containing your rule's configurations.

    Get-PropertyRules -PropertyName 'my-property' -PropertyVersion 'latest' -OutputSnippets -OutputDirectory './my-property-rules'
  2. Add a cloudWrapper behavior to your property's rule trees, selecting a location you've set in your Cloud Wrapper configuration to use its cache space. Additionally, set the trigger criteria.

    Notes:

    • You can't use the cloudWrapper behavior in conjunction with the sure​Route, tiered​Distribution, or siteShield behavior.
    • cloudWrapper isn't compatible with the originTimeout criterion and can't be used within a rule using this criterion.
    • Cloud Wrapper doesn't work with Enhanced TLS hosts.
    {
        "name": "Cloud Wrapper",
        "children": [],
        "behaviors": [
            {
                "name": "cloudWrapper",
                "options": {
                    "enabled": true,
                    "location": "cw-s-usw"
                }
            }
        ],
        "criteria": [
            {
                "name": "requestHeader",
                "options": {
                    "matchOperator": "IS_ONE_OF",
                    "matchWildcardName": false,
                    "matchWildcardValue": false,
                    "matchCaseSensitiveValue": true,
                    "headerName": "enable-cw",
                    "values": [
                        "true"
                    ]
                }
            }
        ],
        "criteriaMustSatisfy": "all",
        "comments": ""
    }
  3. Add your updated rules to your property, pointing to the appropriate directory.

    Send your entire rule tree back. Rules not returned are removed from your property.
    Set-PropertyRules -PropertyName 'my-property' -PropertyVersion 'latest' -InputDirectory './my-property-rules' -VersionNotes 'Adding a Cloud Wrapper setting'

    The output returns your rule tree along with any errors or warnings upon upload.

4. Activate a property

Reactivate your property to enable your Cloud Wrapper configuration on the production network using the New-PropertyActivation command or its alias Deploy-Property.

Deploy-Property -PropertyName 'my-property' -PropertyVersion 'latest' -Network 'PRODUCTION' -NotifyEmails 'jsmith@email.com'
activationLink                                                                                      activationId
--------------                                                                                      ------------
/papi/v1/properties/prp_12345/activations/atv_67890?contractId=ctr_C-0N7RAC7&groupId=grp_12345      atv_67890

Cloud Wrapper configuration

This provides you with a full list of parameters you need to pass in the New-CloudWrapperConfiguration and Set-CloudWrapperConfiguration operations.

Parameter Description
Required
comments The descriptive information you've provided about a configuration.
configName Applies only to the New-CloudWrapperConfiguration operation. A configuration's name. This is the propertyName you set when you create the property.
contractId Applies only to the New-CloudWrapperConfiguration operation. Your contract ID.
locations A list of locations with their traffic settings. Each location record contains:
  • capacity. Required. The total amount of space allotted to a given contract in GB or TB. Contains:
    • unit. Required. The data measurement type, either GB or TB.
    • value. Required. The total units allotted to your contract.
  • comments. Required. The descriptive information you've provided about a location.
  • trafficTypeId. Required. An ID that represents a combination of location and traffic type.
propertyIds A list of the property IDs to which you want to link your Cloud Wrapper configuration.
Optional
capacityAlertsThreshold The storage limit that triggers a threshold alert. Must be between 50100. Displayed as null if you haven't enabled capacity alerts.
multiCdnSettings Details about the Multi CDN settings. Displayed as null if Multi CDN isn't defined in your Cloud Wrapper configuration. Contains:
  • bocc. Required. Details of diagnostic data beacons. This enables real-time beaconing for Broadcast Operations Control Center. Contains:
    • conditionalSamplingFrequency. Required. The conditional sampling frequency of requests and forwards for EDGE, MIDGRESS, and ORIGIN beacons. Set it to ONE_TENTH, or choose ZERO to disable beacons.
    • enabled. Required. When true, it enables diagnostic data beacons for consumption by the Broadcast Operations Control Center.
    • forwardType. Required. The type of forward for which to beacon diagnostics data. Possible values are: ORIGIN_ONLY, MIDGRESS_ONLY, or ORIGIN_AND_MIDGRESS
    • requestType. Required. The type of request for which to beacon diagnostics data, either EDGE_ONLY or EDGE_AND_MIDGRESS.
    • samplingFrequency. Required. The sampling frequency of requests and forwards for EDGE, MIDGRESS, and ORIGIN beacons. Set to ONE_TENTH, or choose ZERO to disable beacons.
  • cdns. Required. A list of CDNs for your configuration. Each CDN record contains:
    • cdnCode. Required. The CDN's ID. Run Get-CloudWrapperProvider for a list of available CDNs.
    • enabled. Required. When true, it enables CDN.
    • cdnAuthKeys. A list of authorization keys for the specified CDN. Each key's name needs to be defined in the authKeyName parameter.
    • httpsOnly. When true, CDN communication is HTTPS only.
    • ipAclCidrs. A list of access controls using IP addresses in CIDR notation.
  • dataStreams. Required. Details of data streams. Contains a list of dataStreamIds.
  • origins. Required. Origin servers corresponding to the properties selected in the configuration. Each origin server record contains:
    • hostname. Required. The origin hostname you've set in your property for your origin behavior. This only applies if originType is set to CUSTOMER. Akamai edge servers use this to retrieve your content, to include it in your Cloud Wrapper cache.
    • originId. Required. The origin ID that's used to generate Multi CDN hostnames.
    • propertyId. Required. The property ID you've configured to deliver your media or website content.
  • enableSoftAlerts. When true, you receive alerts based on soft limits of bandwidth usage.
  • advancedSettings. Available only to Akamai Global Services Support. Details of advanced settings. See Advanced settings for Multi CDN for a list of parameters.
notificationEmails A list of email addresses that receive change notifications.
retainIdleObjects When true, it sets retention status beyond the max idle lifetime of 30 days. Default is false. This applies only to locations you've configured with a redundant content type, like LIVE_VOD or WEB_OPTIMIZED.

Advanced settings for Multi CDN

These settings are available only to Akamai Global Services Support.

Parameter Description
Required
denyResponseCode The code of a deny response, either 403 or 429.
Optional
advancedXmlPost The text appended to the Advanced Metadata XML
advancedXmlPre The text prepended to the Advanced Metadata XML.
amdLiveSetting Settings you've defined in a property to deliver live streaming media using Adaptive Media Delivery (AMD). Displayed as null if the property uses a delivery product other than AMD, or the AMD property isn't configured to deliver live media content. Contains:
  • contentCharacteristicsAMD. Required. The characteristics of the delivered content, used by Akamai to optimize your metadata configuration. Displayed as null if you haven't set these characteristics in your property. Contains:
    • segmentDurationDashCustom/segmentDurationHLSCustom/ segmentDurationSmoothCustom. They customize the number of seconds for the segment. Possible values are between 1 to 10 seconds.
    • segmentSizeDASH/segmentSizeHLS/segmentSizeSmooth. They specify the size of the media object retrieved from the origin. Possible values are:
      • LESS_THAN_1MB
      • ONE_MB_TO_TEN_MB
      • TEN_MB_TO_100_MB
      • GREATER_THAN_100MB
      • OTHER
      • UNKNOWN
  • readTimeout. Required. Specifies how long the edge server should wait for a response after a requesting forward server has established a connection with an edge server. Displayed as null if you haven't set a read timeout in your behavior. Contains:
    • value. Required. A read timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
  • timeout. Required. The HTTP connection timeout. Displayed as null if you haven't set a connect timeout in your behavior. Contains:
    • value. Required. A connect timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
amdVodSetting Settings you've defined in a property to deliver on-demand streaming media using Adaptive Media Delivery (AMD). Displayed as null if the property uses a delivery product other than AMD, or the AMD property isn't configured to deliver live media content. Contains:
  • contentCharacteristicsAMD. Required. The characteristics of the delivered content. Displayed as null if you haven't set these characteristics in your property. Contains:
    • segmentDurationDashCustom/segmentDurationHLSCustom/segmentDurationSmoothCustom. They customize the number of seconds for the segment. Possible values are between 1 to 10 seconds.
    • segmentSizeDASH/segmentSizeHLS/segmentSizeSmooth. They specify the size of the media object retrieved from the origin. Possible values are:
      • LESS_THAN_1MB
      • ONE_MB_TO_TEN_MB
      • TEN_MB_TO_100_MB
      • GREATER_THAN_100MB
      • OTHER
      • UNKNOWN
  • readTimeout. Required. Specifies how long the edge server should wait for a response after a requesting forward server has established a connection with an edge server. Displayed as null if you haven't set a read timeout in your behavior. Contains:
    • value. Required. A read timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
  • timeout. Required. The HTTP connection timeout. Displayed as null if you haven't set a connect timeout in your behavior. Contains:
    • value. Required. A connect timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
baseDirectory The base path of content on your origin server. Include the base path in the required value parameter, starting and ending it with a forward slash (/) character.
cacheKeyQueryParams Cached objects based on specified sets of query parameters. Displayed as null if you haven't included these query parameters in your property. Contains:
  • behavior. Required. Configures how sets of query string parameters translate to cache keys. Possible values are:
    • IGNORE
    • IGNORE_ALL
    • INCLUDE
    • INCLUDE_ALL_PRESERVE_ORDER
    • INCLUDE_ALL_ALPHABETIZE_ORDER
  • exactMatch. When enabled, parameters need to match exactly. Keep disabled to match string prefixes. You can only apply this if behavior is set to INCLUDE or IGNORE. Displayed as null if behavior is any other value.
  • parameters. The set of parameter field names to include in or exclude from the cache key. By default, these match the field names as string prefixes. You can only apply this if behavior is set to INCLUDE or IGNORE. Displayed as null if behavior is any other value.
downloadDeliverySetting Settings you've defined in a property to deliver your content using Download Delivery. Displayed as null if the property uses a delivery product other than Download Delivery. Contains:
  • contentCharacteristicsDD. Required. The characteristics of the delivered content, used by Akamai to optimize your metadata configuration. Displayed as null if you haven't set these characteristics in your property. Contains:
    • objectSize. Required. The size of the media object retrieved from the origin. Possible values are:
      • LESS_THAN_1MB
      • ONE_MB_TO_TEN_MB
      • TEN_MB_TO_100_MB
      • GREATER_THAN_100MB
      • OTHER
      • UNKNOWN
  • readTimeout. Required. Specifies how long the edge server should wait for a response after a requesting forward server has established a connection with an edge server. Displayed as null if you haven't set a read timeout in your behavior. Contains:
    • value. Required. A read timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
  • timeout. Required. The HTTP connection timeout. Displayed as null if you haven't set a connect timeout in your behavior. Contains:
    • value. Required. A connect timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
objectDeliverySetting Settings you've defined in a property to deliver your content using Object Delivery. Displayed as null if the property uses a delivery product other than Object Delivery. Contains:
  • readTimeout. Required. Specifies how long the edge server should wait for a response after a requesting forward server has established a connection with an edge server. Displayed as null if you haven't set a read timeout in your behavior. Contains:
    • value. Required. A read timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
  • timeout. Required. The HTTP connection timeout. Displayed as null if you haven't set a connect timeout in your behavior. Contains:
    • value. Required. A connect timeout value followed by s for seconds, m for minutes, h for hours, or d for days. This value should never be zero. Displayed as null if you haven't set it.
rewriteUrl Modifies the path of incoming requests to forward to your origin server. Displayed as null if you haven't set a baseDirectory in your property. Contains:
  • behavior. Required. The action to perform on the path. Possible values are:
    • REPLACE
    • REMOVE
    • PREPEND
    • REWRITE
    • REGEX_REPLACE
  • keepQueryString. When true, it keeps the original path's query parameters. You can't enable this if you've set this behavior to REWRITE. Displayed as null if the original path contains no query parameters.
  • match. Specifies the part of the incoming path you'd like to remove or modify. Applies only when the behavior is REMOVE or REPLACE. Displayed as null if the behavior is any other option.
  • matchMultiple. When true, it replaces all potential matches rather than only the first match. Applies only when the behavior is REMOVE, REPLACE, or REGEX_REPLACE. Displayed as null if matchMultiple is enabled and the behavior is any other option.
  • matchRegex. When true, it specifies the Perl-compatible regular expression to replace with targetRegex. Applies only when the behavior is REGEX_REPLACE. Displayed as null if the behavior is any other option or the targetRegex field is empty.
  • targetPath. Specifies the path that replaces whatever the match field matches in the incoming request's path. Applies only when the behavior is set to REPLACE. Displayed as null if the behavior is any other option.
  • targetPathPrepend. Specifies a path to prepend to the incoming request's URL. Applies only when the behavior is set to PREPEND. Displayed as null if the behavior is any other option.
  • targetRegex. Replaces whatever the matchRegex field matches. Applies only when the behavior is set to REGEX_REPLACE. Displayed as null if the behavior is any other option or the matchRegex field is empty.
  • targetUrl. Specifies the full path to request from the origin. Applies only when the behavior is set to REWRITE. Displayed as null if the behavior is any other option.