diff --git a/pom.xml b/pom.xml
index a2ee99a..3c89fd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,9 +3,9 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>com.intel.jndn.utils</groupId>
 	<artifactId>jndn-utils</artifactId>
-	<version>0.9.2</version>
+	<version>0.9.3</version>
 	<packaging>jar</packaging>
-	<description>Collection of tools to simplify synchronous and asynchronous requests over the NDN network</description>
+	<description>Collection of tools to simplify synchronous and asynchronous data transfer over the NDN network</description>
 	<dependencies>
 		<dependency>
 			<groupId>net.named_data.jndn</groupId>
diff --git a/src/main/java/com/intel/jndn/utils/Server.java b/src/main/java/com/intel/jndn/utils/Server.java
index d332acf..f13f9bd 100644
--- a/src/main/java/com/intel/jndn/utils/Server.java
+++ b/src/main/java/com/intel/jndn/utils/Server.java
@@ -19,6 +19,7 @@
 import net.named_data.jndn.OnInterest;
 import net.named_data.jndn.OnRegisterFailed;
 import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.security.KeyChain;
 import net.named_data.jndn.transport.Transport;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -36,6 +37,8 @@
   public static final long DEFAULT_TIMEOUT = 2000;
   private static final Logger logger = LogManager.getLogger();
   private static Server defaultInstance;
+  private KeyChain keyChain;
+  private Name certificateName;
 
   /**
    * Singleton access for simpler server use
@@ -50,6 +53,24 @@
   }
 
   /**
+   * Constructor
+   */
+  public Server() {
+    // no signing
+  }
+
+  /**
+   * Constructor; enables signing
+   *
+   * @param keyChain
+   * @param certificateName
+   */
+  public Server(KeyChain keyChain, Name certificateName) {
+    this.keyChain = keyChain;
+    this.certificateName = certificateName;
+  }
+
+  /**
    * Synchronously serve a Data on the given face until one request accesses the
    * data; will return incoming Interest request.
    * <pre><code> Interest request = Client.putSync(face, data); </code></pre>
@@ -73,6 +94,17 @@
       face.registerPrefix(data.getName(), new OnInterest() {
         @Override
         public void onInterest(Name prefix, Interest interest, Transport transport, long registeredPrefixId) {
+          // sign packet
+          if (keyChain != null) {
+            try {
+              keyChain.sign(data, certificateName != null ? certificateName : keyChain.getDefaultCertificateName());
+            } catch (net.named_data.jndn.security.SecurityException e) {
+              logger.error("Failed to sign data for: " + dataName, e);
+              event.fromPacket(e);
+            }
+          }
+
+          // send packet
           try {
             transport.send(data.wireEncode().buf());
             logger.debug("Sent data: " + dataName);
@@ -118,7 +150,7 @@
   /**
    * Asynchronously serve a Data on the given face until an observer stops it.
    * E.g.: NDNObserver observer = Client.put(face, data); // when finished
- serving the data, stop the background thread observer.stop();
+   * serving the data, stop the background thread observer.stop();
    *
    * @param face
    * @param data
@@ -130,10 +162,21 @@
     final NDNObservable eventHandler = new NDNObservable();
     eventHandler.addObserver(observer);
 
-    // setup handlers
+    // setup interest handler
     final OnInterest interestHandler = new OnInterest() {
       @Override
       public void onInterest(Name prefix, Interest interest, Transport transport, long registeredPrefixId) {
+        // sign packet
+        if (keyChain != null) {
+          try {
+            keyChain.sign(data, certificateName != null ? certificateName : keyChain.getDefaultCertificateName());
+          } catch (net.named_data.jndn.security.SecurityException e) {
+            logger.error("Failed to sign data for: " + data.getName().toUri(), e);
+            eventHandler.notify(e);
+          }
+        }
+
+        // send packet
         try {
           transport.send(data.wireEncode().buf());
         } catch (IOException e) {
@@ -142,6 +185,8 @@
         }
       }
     };
+
+    // setup failure handler
     final OnRegisterFailed failureHandler = new OnRegisterFailed() {
       @Override
       public void onRegisterFailed(Name prefix) {
@@ -149,11 +194,13 @@
         eventHandler.notify(new Exception("Failed to register name to put: " + data.getName().toUri()));
       }
     };
+
+    // setup forwarding flags
     final ForwardingFlags flags = new ForwardingFlags();
     flags.setCapture(true); // no shorter routes will answer for this prefix, see http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Route-inheritance
     flags.setChildInherit(false); // the interest name must be exact, no child components after the prefix
 
-    // setup background thread
+    // start background thread
     Thread backgroundThread = new Thread(new Runnable() {
       @Override
       public void run() {
@@ -192,13 +239,13 @@
 
   /**
    * Register a prefix on the face to serve Data packets for incoming Interests.
-   * This method will create a background thread to process events until 
-   * the user calls stop() on the returned observer
-   * 
+   * This method will create a background thread to process events until the
+   * user calls stop() on the returned observer
+   *
    * @param face
    * @param prefix
    * @param handler
-   * @return 
+   * @return
    */
   public NDNObserver on(final Face face, final Name prefix, final OnServeInterest handler) {
     // setup observer
@@ -206,21 +253,38 @@
     final NDNObservable eventHandler = new NDNObservable();
     eventHandler.addObserver(observer);
 
-    // setup handlers
+    // setup interest handler
     final OnInterest interestHandler = new OnInterest() {
       @Override
       public void onInterest(Name prefix, Interest interest, Transport transport, long registeredPrefixId) {
+        // notify observers of interest received
         eventHandler.notify(interest);
+
+        // grab data from OnServeInterest handler
+        Data data = handler.onInterest(prefix, interest);
+
+        // sign packet
+        if (keyChain != null) {
+          try {
+            keyChain.sign(data, certificateName != null ? certificateName : keyChain.getDefaultCertificateName());
+          } catch (net.named_data.jndn.security.SecurityException e) {
+            logger.error("Failed to sign data for: " + interest.getName().toUri(), e);
+            eventHandler.notify(e);
+          }
+        }
+
+        // send packet
         try {
-          Data data = handler.onInterest(prefix, interest);
-          // TODO do signing here?
           transport.send(data.wireEncode().buf());
+          eventHandler.notify(data); // notify observers of data sent
         } catch (IOException e) {
-          logger.error("Failed to send data for: " + prefix.toUri());
+          logger.error("Failed to send data for: " + interest.getName().toUri());
           eventHandler.notify(e);
         }
       }
     };
+
+    // setup failure handler
     final OnRegisterFailed failureHandler = new OnRegisterFailed() {
       @Override
       public void onRegisterFailed(Name prefix) {
@@ -228,11 +292,13 @@
         eventHandler.notify(new Exception("Failed to register name to put: " + prefix.toUri()));
       }
     };
+
+    // setup forwarding flags
     final ForwardingFlags flags = new ForwardingFlags();
     flags.setCapture(true); // no shorter routes will answer for this prefix, see http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Route-inheritance
     flags.setChildInherit(true); // the interest name may have child components after the prefix
 
-    // setup background thread
+    // start background thread
     Thread backgroundThread = new Thread(new Runnable() {
       @Override
       public void run() {
