diff --git a/src/main/java/com/intel/jndn/utils/server/PipelineStage.java b/src/main/java/com/intel/jndn/utils/server/PipelineStage.java
new file mode 100644
index 0000000..15d23f0
--- /dev/null
+++ b/src/main/java/com/intel/jndn/utils/server/PipelineStage.java
@@ -0,0 +1,24 @@
+/*
+ * jndn-utils
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ */
+package com.intel.jndn.utils.server;
+
+/**
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public interface PipelineStage<T, Y> {
+  public Y process(T context) throws Exception;
+//  public void setNextStage(PipelineStage<Y, ?> nextStage);
+//  public PipelineStage<Y, ?> getNextStage();
+}
diff --git a/src/main/java/com/intel/jndn/utils/server/pipeline/CompressionStage.java b/src/main/java/com/intel/jndn/utils/server/pipeline/CompressionStage.java
new file mode 100644
index 0000000..687bde0
--- /dev/null
+++ b/src/main/java/com/intel/jndn/utils/server/pipeline/CompressionStage.java
@@ -0,0 +1,49 @@
+/*
+ * jndn-utils
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ */
+package com.intel.jndn.utils.server.pipeline;
+
+import com.intel.jndn.utils.server.PipelineStage;
+import java.io.ByteArrayOutputStream;
+import java.util.zip.GZIPOutputStream;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.util.Blob;
+
+/**
+ * Sample stage for compressing {@link Data} content using GZIP
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class CompressionStage implements PipelineStage<Data, Data> {
+
+  /**
+   * Compress and replace the {@link Data} content. Note: this stage will return
+   * the same {@link Data} instance and will modify only its content.
+   *
+   * @param context the {@link Data} packet
+   * @return the same packet but with GZIP-compressed content
+   * @throws Exception if compression fails
+   */
+  @Override
+  public Data process(Data context) throws Exception {
+    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+    try (GZIPOutputStream stream = new GZIPOutputStream(buffer)) {
+      stream.write(context.getContent().getImmutableArray(), 0, context.getContent().size());
+      stream.close();
+    }
+
+    context.setContent(new Blob(buffer.toByteArray()));
+    return context;
+  }
+
+}
diff --git a/src/main/java/com/intel/jndn/utils/server/pipeline/SigningStage.java b/src/main/java/com/intel/jndn/utils/server/pipeline/SigningStage.java
new file mode 100644
index 0000000..5296d89
--- /dev/null
+++ b/src/main/java/com/intel/jndn/utils/server/pipeline/SigningStage.java
@@ -0,0 +1,68 @@
+/*
+ * jndn-utils
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ */
+package com.intel.jndn.utils.server.pipeline;
+
+import com.intel.jndn.utils.server.PipelineStage;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.security.KeyChain;
+import net.named_data.jndn.security.SecurityException;
+
+/**
+ * As a part of a {@link com.intel.jndn.utils.ServerIn} pipeline, this stage
+ * will sign a {@link Data} packet.
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class SigningStage implements PipelineStage<Data, Data> {
+
+  private final KeyChain keyChain;
+  private final Name certificateName;
+
+  /**
+   * Default constructor.
+   *
+   * @param keyChain the {@link KeyChain} to use for signing
+   * @param certificateName the certificate to sign with
+   */
+  public SigningStage(KeyChain keyChain, Name certificateName) {
+    this.keyChain = keyChain;
+    this.certificateName = certificateName;
+  }
+
+  /**
+   * Build the stage using the default certificate name defined on the
+   * {@link KeyChain}.
+   *
+   * @param keyChain the {@link KeyChain} to use for signing
+   * @throws SecurityException if no default certificate is found
+   */
+  public SigningStage(KeyChain keyChain) throws SecurityException {
+    this.keyChain = keyChain;
+    this.certificateName = keyChain.getDefaultCertificateName();
+  }
+
+  /**
+   * Sign a {@link Data} packet.
+   *
+   * @param context the data packet to sign
+   * @return the signed data packet
+   * @throws Exception if signing fails
+   */
+  @Override
+  public Data process(Data context) throws Exception {
+    keyChain.sign(context, certificateName);
+    return context;
+  }
+}
diff --git a/src/test/java/com/intel/jndn/utils/server/pipeline/CompressionStageTest.java b/src/test/java/com/intel/jndn/utils/server/pipeline/CompressionStageTest.java
new file mode 100644
index 0000000..12fcd28
--- /dev/null
+++ b/src/test/java/com/intel/jndn/utils/server/pipeline/CompressionStageTest.java
@@ -0,0 +1,51 @@
+/*
+ * jndn-utils
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ */
+package com.intel.jndn.utils.server.pipeline;
+
+import com.intel.jndn.utils.SegmentedClient;
+import java.util.logging.Logger;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.util.Blob;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Test {@link CompressionStage}.
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class CompressionStageTest {
+
+  private static final Logger logger = Logger.getLogger(SegmentedClient.class.getName());
+
+  /**
+   * Test of process method, of class CompressionStage.
+   */
+  @Test
+  public void testProcess() throws Exception {
+    Data data = new Data(new Name("/test/packet"));
+    data.setContent(new Blob(".............................................."));
+    int originalSize = data.getContent().size();
+    logger.info("Uncompressed size: " + originalSize);
+    logger.info("Uncompressed: " + data.getContent().toString());
+
+    CompressionStage instance = new CompressionStage();
+    Data result = instance.process(data);
+    logger.info("Compressed size: " + result.getContent().size());
+    logger.info("Compressed: " + result.getContent().toString());
+
+    assertTrue(result.getContent().size() < originalSize);
+  }
+}
diff --git a/src/test/java/com/intel/jndn/utils/server/pipeline/SigningStageTest.java b/src/test/java/com/intel/jndn/utils/server/pipeline/SigningStageTest.java
new file mode 100644
index 0000000..4f10ab4
--- /dev/null
+++ b/src/test/java/com/intel/jndn/utils/server/pipeline/SigningStageTest.java
@@ -0,0 +1,61 @@
+/*
+ * jndn-utils
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ */
+package com.intel.jndn.utils.server.pipeline;
+
+import com.intel.jndn.mock.MockKeyChain;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.security.KeyChain;
+import net.named_data.jndn.security.SecurityException;
+import net.named_data.jndn.util.Blob;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Test {@link SigningStage}.
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class SigningStageTest {
+
+  KeyChain keyChain;
+  SigningStage instance;
+
+  public SigningStageTest() throws SecurityException {
+    keyChain = MockKeyChain.configure(new Name("/test/signer"));
+    instance = new SigningStage(keyChain);
+  }
+
+  /**
+   * Test of process method, of class SigningStage.
+   */
+  @Test
+  public void testProcess() throws Exception {
+    Data data = new Data(new Name("/test/packet"));
+    data.setContent(new Blob("....."));
+    Data result = instance.process(data);
+    assertTrue(result.getSignature().getSignature().size() > 0);
+  }
+
+  /**
+   * Test of process method, of class SigningStage.
+   */
+  @Test(expected = Exception.class)
+  public void testProcessFailure() throws Exception {
+    SigningStage stage = new SigningStage(keyChain, null); // no default certificate set
+    Data data = new Data(new Name("/test/packet"));
+    data.setContent(new Blob("....."));
+    stage.process(data);
+  }
+
+}
