diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/Site.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/Site.java
index 5f18d83417558face6c02cd857b30ff12f9b7123..3abfd2affca200b48f6c94771f3ced5d720003fd 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/Site.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/Site.java
@@ -29,13 +29,16 @@ import gov.usgs.earthquake.nshmp.gmm.GroundMotionModel;
  * <li><b>{@code z2.5}:</b> Depth to a shear wave velocity of 2.5 km/sec, in
  * units of km.</li>
  *
+ * <li><b>{@code zSed}:</b> Continental margin sediment thickness, in units of
+ * km.</li>
+ *
  * </ul>
  *
  * <p>Both {@code z1.0} and {@code z2.5}, collectively referred to as
- * <i>basin-terms</i>, have default values of {@code Double.NaN}. When supplied
- * with the default, those GMMs that support basin terms will use an author
- * defined model, typically based on {@code Vs30}, to compute basin
- * amplification (or demplification).
+ * <i>basin-terms</i>, and {@code zSed} have default values of
+ * {@code Double.NaN}. When supplied with the default, those GMMs that support
+ * basin terms will use an author defined model, typically based on
+ * {@code Vs30}, to compute basin amplification (or demplification).
  *
  * @author U.S. Geological Survey
  */
@@ -44,39 +47,49 @@ public class Site {
   /** The name used for a {@code Site} with no supplied name. */
   public static final String NO_NAME = "Unnamed";
 
-  /** Default {@link #vs30} value: {@code 760 m/s}. */
+  /** Default {@link #vs30()} value: {@code 760 m/s}. */
   public static final double VS_30_DEFAULT = 760.0;
 
-  /** Supported {@link #vs30} values: {@code [150..2000] m/s}. */
+  /** Supported {@link #vs30()} values: {@code [150..2000] m/s}. */
   public static final Range<Double> VS30_RANGE = Range.closed(150.0, 3000.0);
 
-  /** Default {@link #vsInferred} inferred value: {@code true}. */
+  /** Default {@link #vsInferred()} inferred value: {@code true}. */
   public static final boolean VS_INF_DEFAULT = true;
 
   /**
-   * Default {@link #z1p0} value: {@code NaN} <br>({@link GroundMotionModel}s
+   * Default {@link #z1p0()} value: {@code NaN} <br>({@link GroundMotionModel}s
    * will use a default value or model)
    */
   public static final double Z1P0_DEFAULT = Double.NaN;
 
-  /** Supported {@link #z1p0} values: {@code [0..5] km}. */
+  /** Supported {@link #z1p0()} values: {@code [0..5] km}. */
   public static final Range<Double> Z1P0_RANGE = Range.closed(0.0, 5.0);
 
   /**
-   * Default {@link #z2p5} value: {@code NaN} <br>({@link GroundMotionModel}s
+   * Default {@link #z2p5()} value: {@code NaN} <br>({@link GroundMotionModel}s
    * will use a default value or model)
    */
   public static final double Z2P5_DEFAULT = Double.NaN;
 
-  /** Supported {@link #z2p5} values: {@code [0..10] km}. */
+  /** Supported {@link #z2p5()} values: {@code [0..10] km}. */
   public static final Range<Double> Z2P5_RANGE = Range.closed(0.0, 10.0);
 
+  /**
+   * Default {@link #zSed()} value: {@code NaN} <br>({@link GroundMotionModel}s
+   * will use a default value or model)
+   */
+  public static final double ZSED_DEFAULT = Double.NaN;
+
+  /** Supported {@link #zSed()} values: {@code [0..20] km}. */
+  public static final Range<Double> ZSED_RANGE = Range.closed(0.0, 20.0);
+
   private final String name;
   private final Location location;
   private final double vs30;
   private final boolean vsInferred;
   private final double z1p0;
   private final double z2p5;
+  private final double zSed;
 
   private Site(Builder builder) {
     this.name = builder.name;
@@ -85,6 +98,7 @@ public class Site {
     this.vsInferred = builder.vsInferred;
     this.z1p0 = builder.z1p0;
     this.z2p5 = builder.z2p5;
+    this.zSed = builder.zSed;
   }
 
   /** The site name. */
@@ -138,18 +152,31 @@ public class Site {
     return z2p5;
   }
 
+  /**
+   * Continental margin sediment thickness, in km.
+   *
+   * <p>Default: {@code NaN} <br>({@link GroundMotionModel}s will use a default
+   * value or model)
+   */
+  public final double zSed() {
+    return zSed;
+  }
+
   @Override
   public String toString() {
     return new StringBuilder(Strings.padEnd(name, 28, ' '))
         .append(String.format("%.3f %.3f ", location.longitude, location.latitude))
-        .append(paramString(vs30, vsInferred, z1p0, z2p5))
+        .append(paramString(vs30, vsInferred, z1p0, z2p5, zSed))
         .toString();
   }
 
-  private static String paramString(double vs30, boolean vsInf, double z1p0, double z2p5) {
+  private static String paramString(
+      double vs30, boolean vsInf,
+      double z1p0, double z2p5,
+      double zSed) {
     return String.format(
-        "Vs30=%s %s Z1.0=%s Z2.5=%s",
-        vs30, vsInf ? "inferred " : "measured ", z1p0, z2p5);
+        "Vs30=%s %s Z1.0=%s Z2.5=%s Zsed=%s",
+        vs30, vsInf ? "inferred " : "measured ", z1p0, z2p5, zSed);
   }
 
   /**
@@ -175,6 +202,7 @@ public class Site {
     private boolean vsInferred = VS_INF_DEFAULT;
     private double z1p0 = Z1P0_DEFAULT;
     private double z2p5 = Z2P5_DEFAULT;
+    private double zSed = ZSED_DEFAULT;
 
     boolean built = false;
 
@@ -234,6 +262,16 @@ public class Site {
       return this;
     }
 
+    /** Sediment thickness, in km. */
+    public Builder zSed(double zSed) {
+      if (Double.isNaN(zSed)) {
+        this.zSed = zSed;
+      } else {
+        this.zSed = checkInRange(ZSED_RANGE, Site.Key.ZSED, zSed);
+      }
+      return this;
+    }
+
     /**
      * Build the {@code Site}.
      */
@@ -273,6 +311,8 @@ public class Site {
     public static final String Z1P0 = "z1p0";
     /** The site z2.5 key. */
     public static final String Z2P5 = "z2p5";
+    /** The site zSed key. */
+    public static final String ZSED = "zSed";
   }
 
 }
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/gmm/GmmInput.java b/src/main/java/gov/usgs/earthquake/nshmp/gmm/GmmInput.java
index c92df73fb256dcd5c3fe3384e6e44d627bfaf9ed..bc159b536161688040bfad3e1eb49c85840164b0 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/gmm/GmmInput.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/gmm/GmmInput.java
@@ -15,6 +15,7 @@ import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.WIDTH;
 import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.Z1P0;
 import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.Z2P5;
 import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.ZHYP;
+import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.ZSED;
 import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.ZTOR;
 import static java.lang.Double.NaN;
 
@@ -76,6 +77,8 @@ public class GmmInput {
   public final double z1p0;
   /** Depth to 2.5 km/s (in km). */
   public final double z2p5;
+  /** Sediment thickness (in km). */
+  public final double zSed;
 
   /**
    * Create a deterministic rupture and site property container with all
@@ -112,6 +115,8 @@ public class GmmInput {
    *
    * <li>z2p5 depth to V<sub>s</sub>=2.5 km/sec (in km)</li></ul>
    *
+   * <li>zSed sediment thickness (in km)</li></ul>
+   *
    * @param builder The GmmInput builder
    */
   protected GmmInput(Builder builder) {
@@ -131,6 +136,7 @@ public class GmmInput {
     vsInf = builder.vsInf;
     z1p0 = builder.z1p0;
     z2p5 = builder.z2p5;
+    zSed = builder.zSed;
   }
 
   /**
@@ -169,6 +175,7 @@ public class GmmInput {
     private boolean vsInf;
     private double z1p0;
     private double z2p5;
+    private double zSed;
 
     private Builder() {}
 
@@ -210,9 +217,11 @@ public class GmmInput {
      *
      * <li>vsInf: true</li>
      *
+     * <li>z1p0: NaN ({@code null} when serialized)</li></ul>
+     *
      * <li>z2p5: NaN ({@code null} when serialized)</li>
      *
-     * <li>z1p0: NaN ({@code null} when serialized)</li></ul>
+     * <li>zSed: NaN ({@code null} when serialized)</li></ul>
      *
      * @throws IllegalStateException if any other builder method has already
      *         been called without first calling {@link #build()}
@@ -236,6 +245,7 @@ public class GmmInput {
       vsInf = model.vsInf;
       z1p0 = model.z1p0;
       z2p5 = model.z2p5;
+      zSed = model.zSed;
       flags.set(0, SIZE);
       return this;
     }
@@ -272,10 +282,12 @@ public class GmmInput {
             return rake(v);
           case VS30:
             return vs30(v);
-          case Z2P5:
-            return z2p5(v);
           case Z1P0:
             return z1p0(v);
+          case Z2P5:
+            return z2p5(v);
+          case ZSED:
+            return zSed(v);
         }
       } catch (NumberFormatException nfe) {
         // move along
@@ -388,6 +400,12 @@ public class GmmInput {
       return this;
     }
 
+    /** Set the sediment thickness (in km). */
+    public Builder zSed(double zSed) {
+      this.z2p5 = validateAndFlag(ZSED, zSed);
+      return this;
+    }
+
     public GmmInput build() {
       checkState(flags.cardinality() == SIZE, "Not all fields set");
       reset.clear();
@@ -431,6 +449,7 @@ public class GmmInput {
       .vsInf(VSINF.defaultValue > 0.0)
       .z1p0(Z1P0.defaultValue)
       .z2p5(Z2P5.defaultValue)
+      .z2p5(ZSED.defaultValue)
       .build();
 
   /**
@@ -531,6 +550,13 @@ public class GmmInput {
         "Depth to Vs=2.5 km/s",
         "Depth to a shear-wave velocity of 2.5 kilometers per second, in kilometers",
         Optional.of(DISTANCE_UNIT),
+        NaN),
+
+    ZSED(
+        "zSed",
+        "Sediment thickness",
+        "Thickness of coastal margin sediments, in kilometers",
+        Optional.of(DISTANCE_UNIT),
         NaN);
 
     public final String id;
@@ -583,6 +609,7 @@ public class GmmInput {
         .add(VSINF.toString(), vsInf)
         .add(Z1P0.toString(), z1p0)
         .add(Z2P5.toString(), z2p5)
+        .add(ZSED.toString(), zSed)
         .toString();
   }
 
@@ -604,6 +631,9 @@ public class GmmInput {
     boolean z2p5Check = Double.isNaN(in.z2p5)
         ? Double.isNaN(this.z2p5)
         : this.z2p5 == in.z2p5;
+    boolean zSedCheck = Double.isNaN(in.z2p5)
+        ? Double.isNaN(this.z2p5)
+        : this.z2p5 == in.z2p5;
     return this.Mw == in.Mw &&
         this.rJB == in.rJB &&
         this.rRup == in.rRup &&
@@ -616,13 +646,14 @@ public class GmmInput {
         this.vs30 == in.vs30 &&
         this.vsInf == in.vsInf &&
         z1p0Check &&
-        z2p5Check;
+        z2p5Check &&
+        zSedCheck;
   }
 
   @Override
   public int hashCode() {
     return Objects.hash(Mw, rJB, rRup, rX, dip, width, zTor, zHyp,
-        rake, vs30, vsInf, z1p0, z2p5);
+        rake, vs30, vsInf, z1p0, z2p5, zSed);
   }
 
   /**
@@ -657,6 +688,7 @@ public class GmmInput {
       constraintMap.put(VSINF, builder.vsInf);
       constraintMap.put(Z1P0, builder.z1p0);
       constraintMap.put(Z2P5, builder.z2p5);
+      constraintMap.put(ZSED, builder.zSed);
     }
 
     public Optional<?> get(Field field) {
@@ -741,6 +773,7 @@ public class GmmInput {
       private Optional<Range<Boolean>> vsInf = Optional.empty();
       private Optional<Range<Double>> z1p0 = Optional.empty();
       private Optional<Range<Double>> z2p5 = Optional.empty();
+      private Optional<Range<Double>> zSed = Optional.empty();
 
       /**
        * Set {@code Range<Double>} constraint.
@@ -784,6 +817,9 @@ public class GmmInput {
           case Z2P5:
             z2p5 = Optional.of(constraint);
             break;
+          case ZSED:
+            zSed = Optional.of(constraint);
+            break;
           default:
             throw new IllegalArgumentException(
                 "GmmInput.Constraints.Builder Unsupported field: " + id.name());
@@ -841,6 +877,7 @@ public class GmmInput {
         set(VSINF);
         set(Z1P0, Site.Z1P0_RANGE);
         set(Z2P5, Site.Z2P5_RANGE);
+        set(ZSED, Site.ZSED_RANGE);
 
         return this;
       }