diff --git a/src/org/opensha2/data/Data.java b/src/org/opensha2/data/Data.java
index b32430b3dc28ff269f52d7a69ab6a237dbcb7bc7..8a074a39f692db264feba23f3c24162468394ad7 100644
--- a/src/org/opensha2/data/Data.java
+++ b/src/org/opensha2/data/Data.java
@@ -1447,4 +1447,22 @@ public final class Data {
   // checkArgument(expression, "value");
   // }
 
+  static int firstNonZeroIndex(double... data) {
+    for (int i=0; i<data.length; i++) {
+      if (data[i] != 0.0) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  
+  static int lastNonZeroIndex(double... data) {
+    for (int i=data.length-1; i>=0; i--) {
+      if (data[i] != 0.0) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
 }
diff --git a/src/org/opensha2/data/ImmutableXySequence.java b/src/org/opensha2/data/ImmutableXySequence.java
index 7781dec7c3b1b32a9ee5323096c6c079935daef2..f3d8f96a49bec9ff31c429cb8973e44874e89ab2 100644
--- a/src/org/opensha2/data/ImmutableXySequence.java
+++ b/src/org/opensha2/data/ImmutableXySequence.java
@@ -2,6 +2,7 @@ package org.opensha2.data;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkElementIndex;
+import static com.google.common.base.Preconditions.checkState;
 
 import java.util.Arrays;
 
@@ -65,6 +66,16 @@ class ImmutableXySequence extends XySequence {
   public final boolean isClear() {
     return Data.areZeroValued(ys);
   }
+  
+  @Override
+  public final XySequence trim() {
+    checkState(!this.isClear(), "XySequence.trim() not permitted for 'clear' sequences");
+    int minIndex = Data.firstNonZeroIndex(ys);
+    int maxIndex = Data.lastNonZeroIndex(ys) + 1;
+    return new ImmutableXySequence(
+        Arrays.copyOfRange(xs, minIndex, maxIndex),
+        Arrays.copyOfRange(ys, minIndex, maxIndex));
+  }
 
   @Override
   public final boolean equals(Object obj) {
diff --git a/src/org/opensha2/data/XySequence.java b/src/org/opensha2/data/XySequence.java
index a58ea154fe6d397950561b23fed21027cf857e85..0ed827b989f1418b89f77eace7118ce5b9229785 100644
--- a/src/org/opensha2/data/XySequence.java
+++ b/src/org/opensha2/data/XySequence.java
@@ -506,6 +506,16 @@ public abstract class XySequence implements Iterable<XyPoint> {
    */
   public abstract boolean isClear();
 
+  /**
+   * Returns a new, immutable sequence that has had all leading and trailing
+   * zero-valued points ({@code y = 0}) removed. Any zero-valued points in the
+   * middle of this sequence are ignored.
+   * 
+   * @throws IllegalStateException if {@link #isClear() this.isClear()} as empty
+   *         sequences are not permitted
+   */
+  public abstract XySequence trim();
+
   /**
    * Transforms all y-values in place using the supplied {@link Function}.
    *