diff --git a/java/google/registry/tools/DeleteHostCommand.java b/java/google/registry/tools/DeleteHostCommand.java
new file mode 100644
index 000000000..1070ea49c
--- /dev/null
+++ b/java/google/registry/tools/DeleteHostCommand.java
@@ -0,0 +1,58 @@
+// Copyright 2017 The Nomulus Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package google.registry.tools;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.template.soy.data.SoyMapData;
+import google.registry.tools.soy.DeleteHostSoyInfo;
+
+/** A command to delete a host via EPP. */
+@Parameters(separators = " =", commandDescription = "Delete host")
+final class DeleteHostCommand extends MutatingEppToolCommand {
+
+ @Parameter(
+ names = {"-c", "--client"},
+ description = "Client identifier of the registrar to execute the command as",
+ required = true)
+ String clientId;
+
+ @Parameter(
+ names = "--host",
+ description = "Host name to delete.",
+ required = true)
+ private String hostName;
+
+ @Parameter(
+ names = {"--reason"},
+ description = "Reason for the change.",
+ required = true)
+ private String reason;
+
+ @Parameter(
+ names = {"--registrar_request"},
+ description = "Whether the change was requested by a registrar.",
+ arity = 1)
+ private boolean requestedByRegistrar = false;
+
+ @Override
+ protected void initMutatingEppToolCommand() {
+ setSoyTemplate(DeleteHostSoyInfo.getInstance(), DeleteHostSoyInfo.DELETEHOST);
+ addSoyRecord(clientId, new SoyMapData(
+ "hostName", hostName,
+ "reason", reason,
+ "requestedByRegistrar", requestedByRegistrar));
+ }
+}
diff --git a/java/google/registry/tools/RegistryTool.java b/java/google/registry/tools/RegistryTool.java
index e82efa233..6751ba65a 100644
--- a/java/google/registry/tools/RegistryTool.java
+++ b/java/google/registry/tools/RegistryTool.java
@@ -50,6 +50,7 @@ public final class RegistryTool {
.put("delete_credit", DeleteCreditCommand.class)
.put("delete_domain", DeleteDomainCommand.class)
.put("delete_entity", DeleteEntityCommand.class)
+ .put("delete_host", DeleteHostCommand.class)
.put("delete_premium_list", DeletePremiumListCommand.class)
.put("delete_reserved_list", DeleteReservedListCommand.class)
.put("delete_tld", DeleteTldCommand.class)
diff --git a/java/google/registry/tools/soy/DeleteHost.soy b/java/google/registry/tools/soy/DeleteHost.soy
new file mode 100644
index 000000000..78dd151d7
--- /dev/null
+++ b/java/google/registry/tools/soy/DeleteHost.soy
@@ -0,0 +1,42 @@
+// Copyright 2017 The Nomulus Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+{namespace domain.registry.tools autoescape="strict"}
+
+/**
+ * Delete host request
+ */
+{template .deletehost}
+{@param hostName: string}
+{@param reason: string}
+{@param requestedByRegistrar: any}
+
+
+
+
+
+ {$hostName}
+
+
+
+
+ Deleted by registry administrator: {$reason}
+ {$requestedByRegistrar}
+
+
+ RegistryTool
+
+
+{/template}
diff --git a/javatests/google/registry/tools/DeleteHostCommandTest.java b/javatests/google/registry/tools/DeleteHostCommandTest.java
new file mode 100644
index 000000000..9579b9fee
--- /dev/null
+++ b/javatests/google/registry/tools/DeleteHostCommandTest.java
@@ -0,0 +1,89 @@
+// Copyright 2017 The Nomulus Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package google.registry.tools;
+
+import com.beust.jcommander.ParameterException;
+import org.junit.Test;
+
+/** Unit tests for {@link DeleteHostCommand}. */
+public class DeleteHostCommandTest extends EppToolCommandTestCase {
+
+ @Test
+ public void testSuccess() throws Exception {
+ runCommand("--client=NewRegistrar", "--host=ns1.example.tld", "--force", "--reason=Test");
+ eppVerifier().verifySent("host_delete.xml");
+ }
+
+ @Test
+ public void testSuccess_multipleWordReason() throws Exception {
+ runCommand(
+ "--client=NewRegistrar", "--host=ns1.example.tld", "--force", "--reason=\"Test test\"");
+ eppVerifier().verifySent("host_delete_multiple_word_reason.xml");
+ }
+
+ @Test
+ public void testSuccess_requestedByRegistrarFalse() throws Exception {
+ runCommand(
+ "--client=NewRegistrar",
+ "--host=ns1.example.tld",
+ "--force",
+ "--reason=Test",
+ "--registrar_request=false");
+ eppVerifier().verifySent("host_delete.xml");
+ }
+
+ @Test
+ public void testSuccess_requestedByRegistrarTrue() throws Exception {
+ runCommand(
+ "--client=NewRegistrar",
+ "--host=ns1.example.tld",
+ "--force",
+ "--reason=Test",
+ "--registrar_request=true");
+ eppVerifier().verifySent("host_delete_by_registrar.xml");
+ }
+
+ @Test
+ public void testFailure_noReason() throws Exception {
+ thrown.expect(ParameterException.class);
+ runCommand("--client=NewRegistrar", "--host=ns1.example.tld", "--force");
+ }
+
+ @Test
+ public void testFailure_missingClientId() throws Exception {
+ thrown.expect(ParameterException.class);
+ runCommand("--host=ns1.example.tld", "--force", "--reason=Test");
+ }
+
+ @Test
+ public void testFailure_missingHostName() throws Exception {
+ thrown.expect(ParameterException.class);
+ runCommand("--client=NewRegistrar", "--force", "--reason=Test");
+ }
+
+ @Test
+ public void testFailure_unknownFlag() throws Exception {
+ thrown.expect(ParameterException.class);
+ runCommand(
+ "--client=NewRegistrar", "--host=ns1.example.tld", "--force", "--reason=Test", "--foo");
+ }
+
+ @Test
+ public void testFailure_mainParameter() throws Exception {
+ thrown.expect(ParameterException.class);
+ runCommand(
+ "--client=NewRegistrar", "--host=ns1.example.tld", "--force", "--reason=Test", "foo");
+ }
+}
diff --git a/javatests/google/registry/tools/testdata/host_delete.xml b/javatests/google/registry/tools/testdata/host_delete.xml
new file mode 100644
index 000000000..b56877485
--- /dev/null
+++ b/javatests/google/registry/tools/testdata/host_delete.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ ns1.example.tld
+
+
+
+
+ Deleted by registry administrator: Test
+ false
+
+
+ RegistryTool
+
+
diff --git a/javatests/google/registry/tools/testdata/host_delete_by_registrar.xml b/javatests/google/registry/tools/testdata/host_delete_by_registrar.xml
new file mode 100644
index 000000000..0e5383d37
--- /dev/null
+++ b/javatests/google/registry/tools/testdata/host_delete_by_registrar.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ ns1.example.tld
+
+
+
+
+ Deleted by registry administrator: Test
+ true
+
+
+ RegistryTool
+
+
diff --git a/javatests/google/registry/tools/testdata/host_delete_multiple_word_reason.xml b/javatests/google/registry/tools/testdata/host_delete_multiple_word_reason.xml
new file mode 100644
index 000000000..3c6520131
--- /dev/null
+++ b/javatests/google/registry/tools/testdata/host_delete_multiple_word_reason.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ ns1.example.tld
+
+
+
+
+ Deleted by registry administrator: Test test
+ false
+
+
+ RegistryTool
+
+