diff --git a/apps/addressbook/build.xml b/apps/addressbook/build.xml
index 67feb3ca0693af532a5ca66cbbadb568dee2b6ee..b02dc2409ea07961dcec10de6652d41f5c030593 100644
--- a/apps/addressbook/build.xml
+++ b/apps/addressbook/build.xml
@@ -9,6 +9,7 @@
 	<property name="javac.compilerargs" value="" />
 	<property name="javac.version" value="1.8" />
 	<property name="javac.release" value="8" />
+	<property name="manifest.classpath.name" value="Class-Path" />
 
 	<target name="all" depends="jar, emptyWar"/> 
 	
@@ -57,8 +58,14 @@
 		<property name="workspace.changes.tr" value="" />
 		<jar basedir="${build}" destfile="${dist}/${jar}">
 			<manifest>
-				<attribute name="Main-Class" value="net.i2p.addressbook.Daemon"/>
+				<attribute name="${manifest.classpath.name}" value="i2p.jar" />
+				<attribute name="Main-Class" value="net.i2p.addressbook.CommandLine"/>
+				<attribute name="Specification-Title" value="I2P Address Book" />
+				<attribute name="Specification-Version" value="${api.version}" />
+				<attribute name="Specification-Vendor" value="The I2P Project https://geti2p.net/" />
+				<attribute name="Implementation-Title" value="I2P Java Address Book" />
 				<attribute name="Implementation-Version" value="${full.version}" />
+				<attribute name="Implementation-Vendor" value="The I2P Project https://geti2p.net/" />
 				<attribute name="Built-By" value="${build.built-by}" />
 		                <attribute name="Build-Date" value="${build.timestamp}" />
 		                <attribute name="Base-Revision" value="${workspace.version}" />
diff --git a/apps/addressbook/java/src/net/i2p/addressbook/CommandLine.java b/apps/addressbook/java/src/net/i2p/addressbook/CommandLine.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a33a6eded7d6230deb9de1aa6282d3310f95ded
--- /dev/null
+++ b/apps/addressbook/java/src/net/i2p/addressbook/CommandLine.java
@@ -0,0 +1,42 @@
+package net.i2p.addressbook;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.i2p.CoreVersion;
+
+/**
+ * Simple command line access to various utilities.
+ * Not a public API. Subject to change.
+ * Apps and plugins should use specific classes.
+ *
+ * @since 0.9.55
+ */
+public class CommandLine extends net.i2p.util.CommandLine {
+
+    protected static final List<String> ACLASSES = Arrays.asList(new String[] {
+        "net.i2p.addressbook.HostTxtParser",
+        "net.i2p.router.naming.BlockfileNamingService",
+        "net.metanotion.io.block.BlockFile",
+    });
+
+    protected CommandLine() {}
+
+    public static void main(String args[]) {
+        List<String> classes = new ArrayList<String>(ACLASSES.size() + CLASSES.size());
+        classes.addAll(ACLASSES);
+        classes.addAll(CLASSES);
+        if (args.length > 0) {
+            exec(args, classes);
+        }
+        usage(classes);
+        System.exit(1);
+    }
+
+    private static void usage(List<String> classes) {
+        System.err.println("I2P Address book version " + CoreVersion.VERSION + '\n' +
+                           "USAGE: java -jar /path/to/addressbook.jar command [args]");
+        printCommands(classes);
+    }
+}
diff --git a/apps/addressbook/java/src/net/i2p/addressbook/HostTxtParser.java b/apps/addressbook/java/src/net/i2p/addressbook/HostTxtParser.java
index bfdb55fc74e45ab3d9415ec313d1fcedfa582a95..bf768623146d18676abd2b4aecd8ab0d7221f6f7 100644
--- a/apps/addressbook/java/src/net/i2p/addressbook/HostTxtParser.java
+++ b/apps/addressbook/java/src/net/i2p/addressbook/HostTxtParser.java
@@ -25,9 +25,9 @@ import net.i2p.util.SystemVersion;
  * Utility class providing methods to parse and write files in a hosts.txt file
  * format, and subscription file format.
  * 
- * @since 0.9.26 modified from ConfigParser
+ * @since 0.9.26 modified from ConfigParser, public since 0.9.55 for CLI
  */
-class HostTxtParser {
+public class HostTxtParser {
 
     private static final boolean isWindows = SystemVersion.isWindows();