diff --git a/java/com/android/dialer/commandline/CommandLineModule.java b/java/com/android/dialer/commandline/CommandLineModule.java
index 9022d6c..6121556 100644
--- a/java/com/android/dialer/commandline/CommandLineModule.java
+++ b/java/com/android/dialer/commandline/CommandLineModule.java
@@ -17,6 +17,7 @@
 package com.android.dialer.commandline;
 
 import com.android.dialer.commandline.impl.Blocking;
+import com.android.dialer.commandline.impl.CallCommand;
 import com.android.dialer.commandline.impl.Echo;
 import com.android.dialer.commandline.impl.Help;
 import com.android.dialer.commandline.impl.Version;
@@ -43,13 +44,16 @@
     private final Version version;
     private final Echo echo;
     private final Blocking blocking;
+    private final CallCommand callCommand;
 
     @Inject
-    AospCommandInjector(Help help, Version version, Echo echo, Blocking blocking) {
+    AospCommandInjector(
+        Help help, Version version, Echo echo, Blocking blocking, CallCommand callCommand) {
       this.help = help;
       this.version = version;
       this.echo = echo;
       this.blocking = blocking;
+      this.callCommand = callCommand;
     }
 
     public CommandSupplier.Builder inject(CommandSupplier.Builder builder) {
@@ -57,6 +61,7 @@
       builder.addCommand("version", version);
       builder.addCommand("echo", echo);
       builder.addCommand("blocking", blocking);
+      builder.addCommand("call", callCommand);
       return builder;
     }
   }
diff --git a/java/com/android/dialer/commandline/impl/CallCommand.java b/java/com/android/dialer/commandline/impl/CallCommand.java
new file mode 100644
index 0000000..a6d78f4
--- /dev/null
+++ b/java/com/android/dialer/commandline/impl/CallCommand.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * 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 com.android.dialer.commandline.impl;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import com.android.dialer.buildtype.BuildType;
+import com.android.dialer.buildtype.BuildType.Type;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.commandline.Arguments;
+import com.android.dialer.commandline.Command;
+import com.android.dialer.inject.ApplicationContext;
+import com.android.dialer.precall.PreCall;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import javax.inject.Inject;
+
+/** Make calls. Requires bugfood build. */
+public class CallCommand implements Command {
+
+  private final Context appContext;
+
+  @Inject
+  CallCommand(@ApplicationContext Context appContext) {
+    this.appContext = appContext;
+  }
+
+  @NonNull
+  @Override
+  public String getShortDescription() {
+    return "make a call";
+  }
+
+  @NonNull
+  @Override
+  public String getUsage() {
+    return "call number\n\nuse 'voicemail' to call voicemail";
+  }
+
+  @Override
+  @SuppressWarnings("missingPermission")
+  public ListenableFuture<String> run(Arguments args) throws IllegalCommandLineArgumentException {
+    if (BuildType.get() != Type.BUGFOOD) {
+      throw new SecurityException("Bugfood only command");
+    }
+    String number = args.expectPositional(0, "number");
+    TelecomManager telecomManager = appContext.getSystemService(TelecomManager.class);
+    PhoneAccountHandle phoneAccountHandle =
+        telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
+    CallIntentBuilder callIntentBuilder;
+    if ("voicemail".equals(number)) {
+      callIntentBuilder =
+          CallIntentBuilder.forVoicemail(phoneAccountHandle, CallInitiationType.Type.DIALPAD);
+    } else {
+      callIntentBuilder = new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD);
+    }
+
+    Intent intent = PreCall.getIntent(appContext, callIntentBuilder);
+    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+    appContext.startActivity(intent);
+
+    return Futures.immediateFuture("Calling " + number);
+  }
+}
