diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -78,6 +78,7 @@
     'AlmanacSchemaSpec' => 'applications/almanac/storage/AlmanacSchemaSpec.php',
     'AlmanacService' => 'applications/almanac/storage/AlmanacService.php',
     'AlmanacServiceController' => 'applications/almanac/controller/AlmanacServiceController.php',
+    'AlmanacServiceDatasource' => 'applications/almanac/typeahead/AlmanacServiceDatasource.php',
     'AlmanacServiceEditController' => 'applications/almanac/controller/AlmanacServiceEditController.php',
     'AlmanacServiceEditor' => 'applications/almanac/editor/AlmanacServiceEditor.php',
     'AlmanacServiceListController' => 'applications/almanac/controller/AlmanacServiceListController.php',
@@ -3112,6 +3113,7 @@
       'AlmanacPropertyInterface',
     ),
     'AlmanacServiceController' => 'AlmanacController',
+    'AlmanacServiceDatasource' => 'PhabricatorTypeaheadDatasource',
     'AlmanacServiceEditController' => 'AlmanacServiceController',
     'AlmanacServiceEditor' => 'PhabricatorApplicationTransactionEditor',
     'AlmanacServiceListController' => 'AlmanacServiceController',
diff --git a/src/applications/almanac/query/AlmanacServiceQuery.php b/src/applications/almanac/query/AlmanacServiceQuery.php
--- a/src/applications/almanac/query/AlmanacServiceQuery.php
+++ b/src/applications/almanac/query/AlmanacServiceQuery.php
@@ -9,6 +9,8 @@
   private $serviceClasses;
   private $devicePHIDs;
   private $locked;
+  private $namePrefix;
+  private $nameSuffix;
 
   private $needBindings;
 
@@ -42,6 +44,16 @@
     return $this;
   }
 
+  public function withNamePrefix($prefix) {
+    $this->namePrefix = $prefix;
+    return $this;
+  }
+
+  public function withNameSuffix($suffix) {
+    $this->nameSuffix = $suffix;
+    return $this;
+  }
+
   public function needBindings($need_bindings) {
     $this->needBindings = $need_bindings;
     return $this;
@@ -126,6 +138,20 @@
         (int)$this->locked);
     }
 
+    if ($this->namePrefix !== null) {
+      $where[] = qsprintf(
+        $conn_r,
+        'service.name LIKE %>',
+        $this->namePrefix);
+    }
+
+    if ($this->nameSuffix !== null) {
+      $where[] = qsprintf(
+        $conn_r,
+        'service.name LIKE %<',
+        $this->nameSuffix);
+    }
+
     $where[] = $this->buildPagingClause($conn_r);
 
     return $this->formatWhereClause($where);
diff --git a/src/applications/almanac/typeahead/AlmanacServiceDatasource.php b/src/applications/almanac/typeahead/AlmanacServiceDatasource.php
new file mode 100644
--- /dev/null
+++ b/src/applications/almanac/typeahead/AlmanacServiceDatasource.php
@@ -0,0 +1,43 @@
+<?php
+
+final class AlmanacServiceDatasource
+  extends PhabricatorTypeaheadDatasource {
+
+  public function getPlaceholderText() {
+    return pht('Type a service name...');
+  }
+
+  public function getDatasourceApplicationClass() {
+    return 'PhabricatorAlmanacApplication';
+  }
+
+  public function loadResults() {
+    $viewer = $this->getViewer();
+    $raw_query = $this->getRawQuery();
+
+    $services = id(new AlmanacServiceQuery())
+      ->setViewer($viewer)
+      ->withNamePrefix($raw_query)
+      ->setLimit($this->getLimit())
+      ->execute();
+
+    if ($services) {
+      $handles = id(new PhabricatorHandleQuery())
+        ->setViewer($viewer)
+        ->withPHIDs(mpull($services, 'getPHID'))
+        ->execute();
+    } else {
+      $handles = array();
+    }
+
+    $results = array();
+    foreach ($handles as $handle) {
+      $results[] = id(new PhabricatorTypeaheadResult())
+        ->setName($handle->getName())
+        ->setPHID($handle->getPHID());
+    }
+
+    return $results;
+  }
+
+}