diff --git a/repo b/repo
index f12354a..bf8fa3d 100755
--- a/repo
+++ b/repo
@@ -108,6 +108,7 @@
 S_manifests = 'manifests'       # special manifest repository
 REPO_MAIN = S_repo + '/main.py' # main script
 MIN_PYTHON_VERSION = (2, 6)     # minimum supported python version
+GITC_MANIFEST_DIR = '/usr/local/google/gitc'
 
 
 import errno
@@ -212,14 +213,25 @@
                  dest='config_name', action="store_true", default=False,
                  help='Always prompt for name/e-mail')
 
+def _GitcInitOptions(init_optparse):
+  g = init_optparse.add_option_group('GITC options')
+  g.add_option('-f', '--manifest-file',
+               dest='manifest_file',
+               help='Optional manifest file to use for this GITC client.')
+  g.add_option('-c', '--gitc-client',
+               dest='gitc_client',
+               help='The name for the new gitc_client instance.')
+
 class CloneFailure(Exception):
   """Indicate the remote clone of repo itself failed.
   """
 
 
-def _Init(args):
+def _Init(args, gitc_init=False):
   """Installs repo by cloning it over the network.
   """
+  if gitc_init:
+    _GitcInitOptions(init_optparse)
   opt, args = init_optparse.parse_args(args)
   if args:
     init_optparse.print_usage()
@@ -242,6 +254,15 @@
     raise CloneFailure()
 
   try:
+    if gitc_init:
+      client_dir = os.path.join(GITC_MANIFEST_DIR, opt.gitc_client)
+      if not os.path.exists(client_dir):
+        os.makedirs(client_dir)
+      os.chdir(client_dir)
+      if os.path.exists(repodir):
+        # This GITC Client has already initialized repo so continue.
+        return
+
     os.mkdir(repodir)
   except OSError as e:
     if e.errno != errno.EEXIST:
@@ -732,11 +753,11 @@
       _Help(args)
     if not cmd:
       _NotInstalled()
-    if cmd == 'init':
+    if cmd == 'init' or cmd == 'gitc-init':
       if my_git:
         _SetDefaultsTo(my_git)
       try:
-        _Init(args)
+        _Init(args, gitc_init=(cmd == 'gitc-init'))
       except CloneFailure:
         shutil.rmtree(os.path.join(repodir, S_repo), ignore_errors=True)
         sys.exit(1)
diff --git a/subcmds/gitc_init.py b/subcmds/gitc_init.py
new file mode 100644
index 0000000..9b9cefd
--- /dev/null
+++ b/subcmds/gitc_init.py
@@ -0,0 +1,123 @@
+#
+# Copyright (C) 2015 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.
+
+from __future__ import print_function
+import os
+import shutil
+import sys
+
+import git_command
+from subcmds import init
+
+
+GITC_MANIFEST_DIR = '/usr/local/google/gitc'
+GITC_FS_ROOT_DIR = '/gitc/sha/rw'
+NUM_BATCH_RETRIEVE_REVISIONID = 300
+
+
+class GitcInit(init.Init):
+  common = True
+  helpSummary = "Initialize a GITC Client."
+  helpUsage = """
+%prog [options] [client name]
+"""
+  helpDescription = """
+The '%prog' command is ran to initialize a new GITC client for use
+with the GITC file system.
+
+This command will setup the client directory, initialize repo, just
+like repo init does, and then downloads the manifest collection
+and installs in in the .repo/directory of the GITC client.
+
+Once this is done, a GITC manifest is generated by pulling the HEAD
+SHA for each project and generates the properly formatted XML file
+and installs it as .manifest in the GITC client directory.
+
+The -c argument is required to specify the GITC client name.
+
+The optional -f argument can be used to specify the manifest file to
+use for this GITC client.
+"""
+
+  def _Options(self, p):
+    super(GitcInit, self)._Options(p)
+    g = p.add_option_group('GITC options')
+    g.add_option('-f', '--manifest-file',
+                 dest='manifest_file',
+                 help='Optional manifest file to use for this GITC client.')
+    g.add_option('-c', '--gitc-client',
+                 dest='gitc_client',
+                 help='The name for the new gitc_client instance.')
+
+  def Execute(self, opt, args):
+    if not opt.gitc_client:
+      print('fatal: gitc client (-c) is required', file=sys.stderr)
+      sys.exit(1)
+    self.client_dir = os.path.join(GITC_MANIFEST_DIR, opt.gitc_client)
+    if not os.path.exists(GITC_MANIFEST_DIR):
+      os.makedirs(GITC_MANIFEST_DIR)
+    if not os.path.exists(self.client_dir):
+      os.mkdir(self.client_dir)
+    super(GitcInit, self).Execute(opt, args)
+    if opt.manifest_file:
+      if not os.path.exists(opt.manifest_file):
+        print('fatal: Specified manifest file %s does not exist.' %
+              opt.manifest_file)
+        sys.exit(1)
+      shutil.copyfile(opt.manifest_file,
+                      os.path.join(self.client_dir, '.manifest'))
+    else:
+      self._GenerateGITCManifest()
+    print('Please run `cd %s` to view your GITC client.' %
+          os.path.join(GITC_FS_ROOT_DIR, opt.gitc_client))
+
+  def _SetProjectRevisions(self, projects, branch):
+    """Sets the revisionExpr for a list of projects.
+
+    Because of the limit of open file descriptors allowed, length of projects
+    should not be overly large. Recommend calling this function multiple times
+    with each call not exceeding NUM_BATCH_RETRIEVE_REVISIONID projects.
+
+    @param projects: List of project objects to set the revionExpr for.
+    @param branch: The remote branch to retrieve the SHA from. If branch is
+                   None, 'HEAD' is used.
+    """
+    project_gitcmds = [(
+        project, git_command.GitCommand(None,
+                                        ['ls-remote',
+                                         project.remote.url,
+                                         branch], capture_stdout=True))
+        for project in projects]
+    for proj, gitcmd in project_gitcmds:
+      if gitcmd.Wait():
+        print('FATAL: Failed to retrieve revisionID for %s' % project)
+        sys.exit(1)
+      proj.revisionExpr = gitcmd.stdout.split('\t')[0]
+
+  def _GenerateGITCManifest(self):
+    """Generate a manifest for shafsd to use for this GITC client."""
+    print('Generating GITC Manifest by fetching revision SHAs for each '
+          'project.')
+    manifest = self.manifest
+    project_gitcmd_dict = {}
+    index = 0
+    while index < len(manifest.projects):
+      self._SetProjectRevisions(
+          manifest.projects[index:(index+NUM_BATCH_RETRIEVE_REVISIONID)],
+          manifest.default.revisionExpr)
+      index += NUM_BATCH_RETRIEVE_REVISIONID
+    # Save the manifest.
+    with open(os.path.join(self.client_dir, '.manifest'), 'w') as f:
+      manifest.Save(f)
