diff --git a/README.md b/README.md
index b8d1889..de27444 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ https://www.openrdap.org/demo - live demo
 
 This program uses Go. The Go compiler is available from https://golang.org/.
 
-To install:
+To install from upstream:
 
     go install github.com/openrdap/rdap/cmd/rdap@master
 
@@ -42,6 +42,17 @@ This will install the "rdap" binary in your $GOPATH/go/bin directory. Try runnin
 
     ~/go/bin/rdap google.com
 
+### Compiling from source
+
+If you want to compile and build the binary from the local repository directory:
+
+    # From the repository root directory
+    go build -o rdap ./cmd/rdap
+
+This will generate the executable binary `rdap` in the root of the repository. You can then run it directly:
+
+    ./rdap google.com
+
 ## Usage
 
 | Query type                | Usage                                                                    |
diff --git a/response.go b/response.go
index 4cefbe2..7230909 100644
--- a/response.go
+++ b/response.go
@@ -117,6 +117,14 @@ func (r *Response) ToWhoisStyleResponse() *WhoisStyleResponse {
 		w.add("Name Server", n.LDHName)
 	}
 
+	if d.SecureDNS != nil && d.SecureDNS.DelegationSigned != nil {
+		if *d.SecureDNS.DelegationSigned {
+			w.add("DNSSEC", "signedDelegation")
+		} else {
+			w.add("DNSSEC", "unsigned")
+		}
+	}
+
 	return w
 }
 
diff --git a/response_test.go b/response_test.go
new file mode 100644
index 0000000..adaada2
--- /dev/null
+++ b/response_test.go
@@ -0,0 +1,92 @@
+// OpenRDAP
+// Copyright 2017 Tom Harwood
+// MIT License, see the LICENSE file.
+
+package rdap
+
+import (
+	"testing"
+)
+
+func TestToWhoisStyleResponseDNSSEC(t *testing.T) {
+	trueVal := true
+	falseVal := false
+
+	tests := []struct {
+		name           string
+		secureDNS      *SecureDNS
+		expectedDNSSEC string
+		expectPresent  bool
+	}{
+		{
+			name:           "Nil SecureDNS",
+			secureDNS:      nil,
+			expectedDNSSEC: "",
+			expectPresent:  false,
+		},
+		{
+			name: "Nil DelegationSigned",
+			secureDNS: &SecureDNS{
+				DelegationSigned: nil,
+			},
+			expectedDNSSEC: "",
+			expectPresent:  false,
+		},
+		{
+			name: "DelegationSigned True",
+			secureDNS: &SecureDNS{
+				DelegationSigned: &trueVal,
+			},
+			expectedDNSSEC: "signedDelegation",
+			expectPresent:  true,
+		},
+		{
+			name: "DelegationSigned False",
+			secureDNS: &SecureDNS{
+				DelegationSigned: &falseVal,
+			},
+			expectedDNSSEC: "unsigned",
+			expectPresent:  true,
+		},
+	}
+
+	for _, tc := range tests {
+		t.Run(tc.name, func(t *testing.T) {
+			domain := &Domain{
+				LDHName:   "example.com",
+				SecureDNS: tc.secureDNS,
+			}
+			resp := &Response{
+				Object: domain,
+			}
+
+			w := resp.ToWhoisStyleResponse()
+
+			val, ok := w.Data["DNSSEC"]
+			if tc.expectPresent {
+				if !ok {
+					t.Fatalf("expected DNSSEC key in WHOIS output, but it was missing")
+				}
+				if len(val) != 1 || val[0] != tc.expectedDNSSEC {
+					t.Fatalf("expected DNSSEC to be %q, got %q", tc.expectedDNSSEC, val)
+				}
+
+				// Check that DNSSEC is in KeyDisplayOrder
+				found := false
+				for _, k := range w.KeyDisplayOrder {
+					if k == "DNSSEC" {
+						found = true
+						break
+					}
+				}
+				if !found {
+					t.Fatalf("expected DNSSEC to be in KeyDisplayOrder, but it was not")
+				}
+			} else {
+				if ok {
+					t.Fatalf("expected DNSSEC key to be missing, but it was present with value %q", val)
+				}
+			}
+		})
+	}
+}
