diff --git a/core/Makefile b/core/Makefile
index 2f316ca..05a9b86 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -472,6 +472,27 @@
 
 
 # -----------------------------------------------------------------
+
+.PHONY: event-log-tags
+
+event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags
+ALL_PREBUILT += $(event_log_tag_file)
+
+# Include tags from all packages included in this product.
+event_log_tags_src := \
+    $(sort $(foreach m,\
+      $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \
+      $(call module-names-for-tag-list,user), \
+      $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
+
+$(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src)
+$(event_log_tags_file): $(event_log_tags_src)
+	$(hide) mkdir -p $(dir $@)
+	$(hide) build/tools/merge-event-log-tags.py -o $@ $(PRIVATE_SRC_FILES)
+
+event-log-tags: $(event_log_tags_file)
+
+# -----------------------------------------------------------------
 # Build a keystore with the authorized keys in it, used to verify the
 # authenticity of downloaded OTA packages.
 #
diff --git a/core/base_rules.mk b/core/base_rules.mk
index 64b74e7..8937360 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -186,11 +186,38 @@
 endif
 
 ###########################################################
+## logtags: Add .logtags files to global list, emit java source
+###########################################################
+
+logtags_sources := $(filter %.logtags,$(LOCAL_SRC_FILES))
+
+ifneq ($(strip $(logtags_sources)),)
+
+event_log_tags := $(addprefix $(LOCAL_PATH)/,$(logtags_sources))
+
+# Emit a java source file with constants for the tags, if
+# LOCAL_MODULE_CLASS is "APPS" or "JAVA_LIBRARIES".
+ifneq ($(strip $(filter $(LOCAL_MODULE_CLASS),APPS JAVA_LIBRARIES)),)
+
+logtags_java_sources := $(patsubst %.logtags,%.java,$(addprefix $(intermediates.COMMON)/src/, $(logtags_sources)))
+logtags_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(logtags_sources))
+
+$(logtags_java_sources): $(intermediates.COMMON)/src/%.java: $(TOPDIR)$(LOCAL_PATH)/%.logtags
+	$(transform-logtags-to-java)
+
+endif
+
+else
+logtags_java_sources :=
+event_log_tags :=
+endif
+
+###########################################################
 ## Java: Compile .java files to .class
 ###########################################################
 #TODO: pull this into java.make once host and target are combined
 
-java_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(filter %.java,$(LOCAL_SRC_FILES))) $(aidl_java_sources)
+java_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(filter %.java,$(LOCAL_SRC_FILES))) $(aidl_java_sources) $(logtags_java_sources)
 all_java_sources := $(java_sources) $(addprefix $($(my_prefix)OUT_COMMON_INTERMEDIATES)/, $(filter %.java,$(LOCAL_INTERMEDIATE_SOURCES)))
 
 ## Java resources #########################################
@@ -432,6 +459,8 @@
     $(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(LOCAL_INSTALLED_MODULE)
 ALL_MODULES.$(LOCAL_MODULE).REQUIRED := \
     $(ALL_MODULES.$(LOCAL_MODULE).REQUIRED) $(LOCAL_REQUIRED_MODULES)
+ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS := \
+    $(ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS) $(event_log_tags)
 
 ###########################################################
 ## Take care of LOCAL_MODULE_TAGS
diff --git a/core/config.mk b/core/config.mk
index e574124..586f403 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -201,6 +201,7 @@
 E2FSCK := e2fsck
 JARJAR := java -jar $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar
 PROGUARD := external/proguard/bin/proguard.sh
+JAVATAGS := build/tools/java-event-log-tags.py
 
 # dx is java behind a shell script; no .exe necessary.
 DX := $(HOST_OUT_EXECUTABLES)/dx
@@ -295,7 +296,6 @@
 
 PREBUILT_IS_PRESENT := $(if $(wildcard prebuilt/Android.mk),true)
 
-
 # ###############################################################
 # Collect a list of the SDK versions that we could compile against
 # For use with the LOCAL_SDK_VERSION variable for include $(BUILD_PACKAGE)
diff --git a/core/definitions.mk b/core/definitions.mk
index 06b6201..61bd562 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -717,6 +717,16 @@
 #$(AIDL) $(PRIVATE_AIDL_FLAGS) $< - | indent -nut -br -npcs -l1000 > $@
 
 
+###########################################################
+## Commands for running java-event-log-tags.py
+###########################################################
+
+define transform-logtags-to-java
+@mkdir -p $(dir $@)
+@echo "logtags: $@ <= $<"
+$(hide) $(JAVATAGS) -o $@ $<
+endef
+
 
 ###########################################################
 ## Commands for running gcc to compile a C++ file
diff --git a/tools/event_log_tags.py b/tools/event_log_tags.py
new file mode 100644
index 0000000..fc05aff
--- /dev/null
+++ b/tools/event_log_tags.py
@@ -0,0 +1,112 @@
+# Copyright (C) 2009 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.
+
+"""A module for reading and parsing event-log-tags files."""
+
+import re
+import sys
+
+class Tag(object):
+  __slots__ = ["tagnum", "tagname", "description", "filename", "linenum"]
+
+  def __init__(self, tagnum, tagname, description, filename, linenum):
+    self.tagnum = tagnum
+    self.tagname = tagname
+    self.description = description
+    self.filename = filename
+    self.linenum = linenum
+
+
+class TagFile(object):
+  """Read an input event-log-tags file."""
+  def AddError(self, msg, linenum=None):
+    if linenum is None:
+      linenum = self.linenum
+    self.errors.append((self.filename, linenum, msg))
+
+  def AddWarning(self, msg, linenum=None):
+    if linenum is None:
+      linenum = self.linenum
+    self.warnings.append((self.filename, linenum, msg))
+
+  def __init__(self, filename, file_object=None):
+    """'filename' is the name of the file (included in any error
+    messages).  If 'file_object' is None, 'filename' will be opened
+    for reading."""
+    self.errors = []
+    self.warnings = []
+    self.tags = []
+    self.options = {}
+
+    self.filename = filename
+    self.linenum = 0
+
+    if file_object is None:
+      try:
+        file_object = open(filename, "rb")
+      except (IOError, OSError), e:
+        self.AddError(str(e))
+        return
+
+    try:
+      for self.linenum, line in enumerate(file_object):
+        self.linenum += 1
+
+        line = line.strip()
+        if not line or line[0] == '#': continue
+        parts = re.split(r"\s+", line, 2)
+
+        if len(parts) < 2:
+          self.AddError("failed to parse \"%s\"" % (line,))
+          continue
+
+        if parts[0] == "option":
+          self.options[parts[1]] = parts[2:]
+          continue
+
+        try:
+          tag = int(parts[0])
+        except ValueError:
+          self.AddError("\"%s\" isn't an integer tag" % (parts[0],))
+          continue
+
+        tagname = parts[1]
+        if len(parts) == 3:
+          description = parts[2]
+        else:
+          description = None
+
+        self.tags.append(Tag(tag, tagname, description,
+                             self.filename, self.linenum))
+    except (IOError, OSError), e:
+      self.AddError(str(e))
+
+
+def WriteOutput(output_file, data):
+  """Write 'data' to the given output filename (which may be None to
+  indicate stdout).  Emit an error message and die on any failure.
+  'data' may be a string or a StringIO object."""
+  if not isinstance(data, str):
+    data = data.getvalue()
+  try:
+    if output_file is None:
+      out = sys.stdout
+      output_file = "<stdout>"
+    else:
+      out = open(output_file, "wb")
+    out.write(data)
+    out.close()
+  except (IOError, OSError), e:
+    print >> sys.stderr, "failed to write %s: %s" % (output_file, e)
+    sys.exit(1)
diff --git a/tools/java-event-log-tags.py b/tools/java-event-log-tags.py
new file mode 100755
index 0000000..f8374b0
--- /dev/null
+++ b/tools/java-event-log-tags.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2009 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.
+
+"""
+Usage: java-event-log-tags.py [-o output_file] <input_file>
+
+Generate a java class containing constants for each of the event log
+tags in the given input file.
+
+-h to display this usage message and exit.
+"""
+
+import cStringIO
+import getopt
+import os
+import sys
+
+import event_log_tags
+
+output_file = None
+
+try:
+  opts, args = getopt.getopt(sys.argv[1:], "ho:")
+except getopt.GetoptError, err:
+  print str(err)
+  print __doc__
+  sys.exit(2)
+
+for o, a in opts:
+  if o == "-h":
+    print __doc__
+    sys.exit(2)
+  elif o == "-o":
+    output_file = a
+  else:
+    print >> sys.stderr, "unhandled option %s" % (o,)
+    sys.exit(1)
+
+if len(args) != 1:
+  print "need exactly one input file, not %d" % (len(args),)
+  print __doc__
+  sys.exit(1)
+
+fn = args[0]
+tagfile = event_log_tags.TagFile(fn)
+
+if "java_package" not in tagfile.options:
+  tagfile.AddError("java_package option not specified", linenum=0)
+
+if tagfile.errors:
+  for fn, ln, msg in tagfile.errors:
+    print >> sys.stderr, "%s:%d: error: %s" % (fn, ln, msg)
+  sys.exit(1)
+
+buffer = cStringIO.StringIO()
+buffer.write("/* This file is auto-generated.  DO NOT MODIFY.\n"
+             " * Source file: %s\n"
+             " */\n\n" % (fn,))
+
+buffer.write("package %s;\n\n" % (tagfile.options["java_package"][0],))
+
+basename, _ = os.path.splitext(os.path.basename(fn))
+buffer.write("public class %s {\n" % (basename,))
+buffer.write("  private %s() { }  // don't instantiate\n" % (basename,))
+
+for t in tagfile.tags:
+  if t.description:
+    buffer.write("\n  /** %d %s %s */\n" % (t.tagnum, t.tagname, t.description))
+  else:
+    buffer.write("\n  /** %d %s */\n" % (t.tagnum, t.tagname))
+
+  buffer.write("  public static final int %s = %d;\n" %
+               (t.tagname.upper(), t.tagnum))
+buffer.write("}\n");
+
+event_log_tags.WriteOutput(output_file, buffer)
diff --git a/tools/merge-event-log-tags.py b/tools/merge-event-log-tags.py
new file mode 100755
index 0000000..2852612
--- /dev/null
+++ b/tools/merge-event-log-tags.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2009 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.
+
+"""
+Usage: merge-event-log-tags.py [-o output_file] [input_files...]
+
+Merge together zero or more event-logs-tags files to produce a single
+output file, stripped of comments.  Checks that no tag numbers conflict
+and fails if they do.
+
+-h to display this usage message and exit.
+"""
+
+import cStringIO
+import getopt
+import sys
+
+import event_log_tags
+
+by_tagnum = {}
+errors = []
+warnings = []
+
+output_file = None
+
+try:
+  opts, args = getopt.getopt(sys.argv[1:], "ho:")
+except getopt.GetoptError, err:
+  print str(err)
+  print __doc__
+  sys.exit(2)
+
+for o, a in opts:
+  if o == "-h":
+    print __doc__
+    sys.exit(2)
+  elif o == "-o":
+    output_file = a
+  else:
+    print >> sys.stderr, "unhandled option %s" % (o,)
+    sys.exit(1)
+
+for fn in args:
+  tagfile = event_log_tags.TagFile(fn)
+
+  for t in tagfile.tags:
+    tagnum = t.tagnum
+    tagname = t.tagname
+    description = t.description
+
+    if t.tagnum in by_tagnum:
+      orig = by_tagnum[t.tagnum]
+
+      if (t.tagname == orig.tagname and
+          t.description == orig.description):
+        # if the name and description are identical, issue a warning
+        # instead of failing (to make it easier to move tags between
+        # projects without breaking the build).
+        tagfile.AddWarning("tag %d \"%s\" duplicated in %s:%d" %
+                           (t.tagnum, t.tagname, orig.filename, orig.linenum),
+                           linenum=t.linenum)
+      else:
+        tagfile.AddError("tag %d used by conflicting \"%s\" from %s:%d" %
+                         (t.tagnum, orig.tagname, orig.filename, orig.linenum),
+                         linenum=t.linenum)
+      continue
+
+    by_tagnum[t.tagnum] = t
+
+  errors.extend(tagfile.errors)
+  warnings.extend(tagfile.warnings)
+
+if errors:
+  for fn, ln, msg in errors:
+    print >> sys.stderr, "%s:%d: error: %s" % (fn, ln, msg)
+  sys.exit(1)
+
+if warnings:
+  for fn, ln, msg in warnings:
+    print >> sys.stderr, "%s:%d: warning: %s" % (fn, ln, msg)
+
+buffer = cStringIO.StringIO()
+for n in sorted(by_tagnum):
+  t = by_tagnum[n]
+  if t.description:
+    buffer.write("%d %s %s\n" % (t.tagnum, t.tagname, t.description))
+  else:
+    buffer.write("%d %s\n" % (t.tagnum, t.tagname))
+
+event_log_tags.WriteOutput(output_file, buffer)
