diff --git a/news/fix_u_contact.rst b/news/fix_u_contact.rst
new file mode 100644
index 00000000..992c96a9
--- /dev/null
+++ b/news/fix_u_contact.rst
@@ -0,0 +1,13 @@
+**Added:** None
+
+**Changed:**
+ * u_contact now only requires institution when adding, but not when updating
+ * u_contact can take an id as an optional argument
+
+**Deprecated:** None
+
+**Removed:** None
+
+**Fixed:** None
+
+**Security:** None
diff --git a/regolith/helpers/u_contacthelper.py b/regolith/helpers/u_contacthelper.py
index 89352695..641bc779 100644
--- a/regolith/helpers/u_contacthelper.py
+++ b/regolith/helpers/u_contacthelper.py
@@ -16,9 +16,12 @@ TARGET_COLL = "contacts"
 
 def subparser(subpi):
     subpi.add_argument("name", help="first name space last name in quotes")
-    subpi.add_argument("institution", help="person's institution.  Can be inf"
-                                            "short form such as columbiau and will "
-                                            "be retrieved from institutions collection")
+    subpi.add_argument("-d", "--id", help="id of the person, e.g., first letter first name "
+                                            "plus last name, but unique")
+    subpi.add_argument("-i", "--institution", help="person's institution. It can be "
+                                                   "institution id or anything in the "
+                                                   "aka or name from institutions collection. "
+                                                   "it is required to create a new contact")
     #FIXME
     # subpi.add_argument("-e", "--email",
     #                    help="email address")
@@ -72,7 +75,10 @@ class ContactUpdaterHelper(DbHelperBase):
             now = dt.datetime.now()
         else:
             now = date_parser.parse(rc.date).date()
-        key = str(name.first[0].lower().replace(" ", "") + name.last.lower().replace(" ", ""))
+        if not rc.id:
+            key = str(name.first[0].lower().replace(" ", "") + name.last.lower().replace(" ", ""))
+        else:
+            key = rc.id
         filterid = {'_id': key}
         coll = self.gtx[rc.coll]
         pdoc = {'_id': key}
@@ -82,11 +88,14 @@ class ContactUpdaterHelper(DbHelperBase):
             notes = current.get('notes', [])
             aliases = current.get('aka', [])
         else:
-            pdoc.update({"date": dt.today()})
+            if not rc.institution:
+                raise RuntimeError("Institution is required to create a new contact")
+            pdoc.update({"date": dt.date.today()})
+            pdoc.update({"institution": rc.institution})
             notes = []
             aliases = []
-            UUID = str(uuid.uuid4())
-            pdoc.update({'uuid': UUID})
+            uniqueidentifier = str(uuid.uuid4())
+            pdoc.update({'uuid': uniqueidentifier})
         #FIXME
         # if rc.e_email:
         #     pdoc.update({"email": rc.email})
@@ -98,9 +107,7 @@ class ContactUpdaterHelper(DbHelperBase):
             notes.extend(rc.notes)
         pdoc.update({"aka": aliases})
         pdoc.update({"notes": notes})
-        pdoc.update({"name": name.full_name,
-                    "institution": rc.institution,
-                    })
+        pdoc.update({"name": name.full_name})
         pdoc.update({'updated': now})
 
         rc.client.update_one(rc.database, rc.coll, filterid, pdoc)

ENH: contact updater can take an id as an optional argument
When updating (rather than adding) it would be nice to be able to specify an id rather than first/last name only.

Come to think of it, it would be nice to be able to specify an id in any case, for example, with chinese names (and possibly other nationalities in the future) our "standard" behavior is to put two initials from the first name (so Songsheng Tao is sstao, not stao)

diff --git a/tests/test_helpers.py b/tests/test_helpers.py
index 4f08b907..22b0e4b1 100644
--- a/tests/test_helpers.py
+++ b/tests/test_helpers.py
@@ -49,14 +49,13 @@ helper_map = [
     (["helper", "l_contacts", "run", "-n", "ny", "-i", "col", "-o", "coffee", "-d", "2020-01-15", "-r", "2"],
      "name: Anthony B Friend, institution: columbiau, email: friend@deed.com\n"
      ),
-    (["helper", "u_contact", "Anthony B Friend", "columbiau", "-a", "Friend", "--date", "2020-01-02",
+    (["helper", "u_contact", "Anthony B Friend","--id", "afriend", "-a", "Friend", "--date", "2020-01-02",
       "-n", "Test note"],
      "Anthony B Friend has been added/updated in contacts\n"
      ),
     (["helper", "l_contacts", "run", "-n", "ny", "-i", "col", "-o", "coffee", "-d", "2019-01-15", "-r", "2"],
      ""
      ),
-
     ]
 
 

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.9
requirements/run.txt requirements/test.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
bibtexparser==1.4.3
Cerberus==1.3.7
certifi==2025.1.31
charset-normalizer==3.4.1
codecov==2.1.13
coverage==7.8.0
docutils==0.21.2
et_xmlfile==2.0.0
exceptiongroup==1.2.2
idna==3.10
iniconfig==2.1.0
Jinja2==3.1.6
MarkupSafe==3.0.2
nameparser==1.1.3
numpy==2.0.2
openpyxl==3.1.5
packaging==24.2
pandas==2.2.3
pluggy==1.5.0
pyparsing==3.2.3
pytest==8.3.5
python-dateutil==2.9.0.post0
pytz==2025.2
-e git+https://github.com/regro/regolith.git@ed0a79dd6ad1cb98a77632b65ebe61135c10dffd#egg=regolith
requests==2.32.3
rever==0.3.3
ruamel.yaml==0.18.10
ruamel.yaml.clib==0.2.12
six==1.17.0
tomli==2.2.1
tzdata==2025.2
urllib3==2.3.0
xonsh==0.19.3

name: regolith
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - bibtexparser==1.4.3
      - cerberus==1.3.7
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - codecov==2.1.13
      - coverage==7.8.0
      - docutils==0.21.2
      - et-xmlfile==2.0.0
      - exceptiongroup==1.2.2
      - idna==3.10
      - iniconfig==2.1.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - nameparser==1.1.3
      - numpy==2.0.2
      - openpyxl==3.1.5
      - packaging==24.2
      - pandas==2.2.3
      - pluggy==1.5.0
      - pyparsing==3.2.3
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.32.3
      - rever==0.3.3
      - ruamel-yaml==0.18.10
      - ruamel-yaml-clib==0.2.12
      - six==1.17.0
      - tomli==2.2.1
      - tzdata==2025.2
      - urllib3==2.3.0
      - xonsh==0.19.3
prefix: /opt/conda/envs/regolith

tests/test_helpers.py::test_helper_python[hm14]
tests/test_helpers.py::test_helper_python[hm0] tests/test_helpers.py::test_helper_python[hm1] tests/test_helpers.py::test_helper_python[hm2] tests/test_helpers.py::test_helper_python[hm3] tests/test_helpers.py::test_helper_python[hm4] tests/test_helpers.py::test_helper_python[hm5] tests/test_helpers.py::test_helper_python[hm6] tests/test_helpers.py::test_helper_python[hm7] tests/test_helpers.py::test_helper_python[hm8] tests/test_helpers.py::test_helper_python[hm9] tests/test_helpers.py::test_helper_python[hm10] tests/test_helpers.py::test_helper_python[hm11] tests/test_helpers.py::test_helper_python[hm12] tests/test_helpers.py::test_helper_python[hm13] tests/test_helpers.py::test_helper_python[hm15]
news/fix_u_contact.rst regolith/helpers/u_contacthelper.py
news/fix_u_contact.rst regolith/helpers/u_contacthelper.py