diff --git a/services/wsprd/app/app.go b/services/wsprd/app/app.go
index 1ac1363..9acd92b 100644
--- a/services/wsprd/app/app.go
+++ b/services/wsprd/app/app.go
@@ -73,12 +73,16 @@
 	IsStreaming bool
 }
 
-// A request javascript to serve undern a particular name
 type serveRequest struct {
 	Name     string
 	ServerId uint64
 }
 
+type addRemoveNameRequest struct {
+	Name     string
+	ServerId uint64
+}
+
 type jsonCaveatValidator struct {
 	Type string `json:"_type"`
 	Data json.RawMessage
@@ -566,6 +570,65 @@
 	}
 }
 
+// HandleAddNameRequest takes a request to add a new name to a server
+func (c *Controller) HandleAddNameRequest(data string, w lib.ClientWriter) {
+	var request addRemoveNameRequest
+	if err := json.Unmarshal([]byte(data), &request); err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+
+	// Create a server for the websocket pipe, if it does not exist already
+	server, err := c.maybeCreateServer(request.ServerId)
+	if err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+
+	// Add name
+	if err := server.AddName(request.Name); err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+
+	// Send true to indicate request has finished without error
+	if err := w.Send(lib.ResponseFinal, true); err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+}
+
+// HandleRemoveNameRequest takes a request to remove a name from a server
+func (c *Controller) HandleRemoveNameRequest(data string, w lib.ClientWriter) {
+	var request addRemoveNameRequest
+	if err := json.Unmarshal([]byte(data), &request); err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+
+	// Create a server for the websocket pipe, if it does not exist already
+	server, err := c.maybeCreateServer(request.ServerId)
+	if err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+
+	// Remove name
+	if err := server.RemoveName(request.Name); err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+
+	// Remove name from signature cache as well
+	c.signatureManager.FlushCacheEntry(request.Name)
+
+	// Send true to indicate request has finished without error
+	if err := w.Send(lib.ResponseFinal, true); err != nil {
+		w.Error(verror2.Convert(verror2.Internal, nil, err))
+		return
+	}
+}
+
 // HandleServerResponse handles the completion of outstanding calls to JavaScript services
 // by filling the corresponding channel with the result from JavaScript.
 func (c *Controller) HandleServerResponse(id int64, data string) {
