diff --git a/NEWS b/NEWS
index dee869d32d5b2701ce34b1a7f1b26171c313a696..57e7b05eaccd39ce0a6c54604601cf97e4c2cb0a 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ release/005.007 (unreleased)
     [kerberos] Add option to completely override /etc/krb5.conf using
     the parameter 'source'. [adamhl]
 
+    [kerberos] Add a new 'define' that makes it easier to setup a
+    krb5.conf file. The define is base::kerberos::krb5_conf [adamhl]
+
     [newsyslog] Pull out filter-syslog from newsyslog so filtersyslog can
     be used separately from newsyslog. [adamhl]
 
diff --git a/manifests/kerberos/krb5_conf.pp b/manifests/kerberos/krb5_conf.pp
new file mode 100644
index 0000000000000000000000000000000000000000..9ded137d67484b80b9705c8cf97e73562f9abd5c
--- /dev/null
+++ b/manifests/kerberos/krb5_conf.pp
@@ -0,0 +1,153 @@
+# A define that creates a krb5.conf file.
+#
+# The $name parameter is where the file will be put.
+#
+# $prefer_tcp:
+#   Normal kerberos traffic uses UDP, but some applications
+#   (lookin' at you Java!) work better with TCP. Set this parameter to
+#   "true" to force the client to prefer TCP to UDP.
+#   Default: false
+#
+# $rdns_enabled:
+#   If 'true' have the Kerberos client do a reverse DNS lookup on the
+#   hostname when connecting to a server. This should be set to 'false' if
+#   you want the client to be able to connect to services where the service
+#   name's IP address PTR record may not match the hostname (e.g., for
+#   services running in Amazon Web Services).
+#   Default: true
+#
+## ADVANCED
+#
+# $env: Valid values:
+#  * prod (default)
+#  * dev
+#  * test
+#  * uat
+#  * qa
+#  * custom
+#
+# In the "stanford.edu" section of [realms], by default the production
+# settings will appear:
+#
+#   [realms]
+#       stanford.edu = {
+#           kdc            = krb5auth1.stanford.edu:88
+#           kdc            = krb5auth2.stanford.edu:88
+#           kdc            = krb5auth3.stanford.edu:88
+#           master_kdc     = master-kdc.stanford.edu:88
+#           admin_server   = krb5-admin.stanford.edu
+#           kpasswd_server = krb5-admin.stanford.edu
+#           default_domain = stanford.edu
+#           kadmind_port   = 749
+#       }
+#
+# If the environment is set to a different value, then that section will
+# instead look like this:
+#
+#   [realms]
+#       stanford.edu = {
+#           kdc            = krb5auth-<env>1.stanford.edu:88
+#           kdc            = krb5auth-<env>2.stanford.edu:88
+#           kdc            = krb5auth-<env>3.stanford.edu:88
+#           kdc            = krb5auth-<env>4.stanford.edu:88
+#           master_kdc     = master-kdc-<env>.stanford.edu:88
+#           admin_server   = krb5-admin-<env>.stanford.edu
+#           kpasswd_server = krb5-admin-<env>.stanford.edu
+#           default_domain = stanford.edu
+#           kadmind_port   = 749
+#       }
+#
+# For example, if $env is set to 'test', then the above would be
+#
+#   [realms]
+#       stanford.edu = {
+#           kdc            = krb5auth-test1.stanford.edu:88
+#           kdc            = krb5auth-test2.stanford.edu:88
+#           kdc            = krb5auth-test3.stanford.edu:88
+#           kdc            = krb5auth-test4.stanford.edu:88
+#           master_kdc     = master-kdc-test.stanford.edu:88
+#           admin_server   = krb5-admin-test.stanford.edu
+#           kpasswd_server = krb5-admin-test.stanford.edu
+#           default_domain = stanford.edu
+#           kadmind_port   = 749
+#       }
+#
+#
+# Finally, if you want to override these using these parameters, set the
+# $env variable to 'custom' and set these parameters:
+#
+#
+# $kdcs: Use this set of server names for the "kdc" entries in the
+#   realm. If the array is empty, use the the normal production KDC list.
+#
+# Example:
+#  kdcs => ['kerberos-qa2.stanford.edu', 'kerberos-qa1.stanford.edu'],
+#
+# will result in
+#
+# [realms]
+#   stanford.edu = {
+#     kdc            = kerberos-qa2.stanford.edu:88
+#     kdc            = kerberos-qa1.stanford.edu:88
+#
+# $master_kdc: sets the master_kdc setting.
+#
+# $admin_server: sets the admin_server setting
+#
+# $kpasswd_server: sets the kpasswd_server setting.
+#
+# NOTE! If $env is set to 'custom', then ALL of $kdcs, $master_kdc,
+# $admin_server, and $kpasswd_server MUST be set. If not, Puppet will
+# raise an exception.
+
+
+define kerberos::krb5_conf (
+  $env                             = 'prod',
+  $realm                           = 'stanford.edu',
+  $default_realm                   = 'stanford.edu',
+  $stanford_realm_is_production    = true,
+  $kdcs                            = [],
+  $master_kdc                      = undef,
+  $admin_server                    = undef,
+  $kpasswd_server                  = undef,
+  $rdns_enabled                    = true,
+  $prefer_tcp                      = false,
+) {
+
+  case $env {
+    'prod': {
+      $kdcs_actual = [
+        "krb5auth1.stanford.edu",
+        "krb5auth2.stanford.edu",
+        "krb5auth3.stanford.edu",
+      ]
+      $master_kdc_actual     = "master-kdc.stanford.edu"
+      $admin_server_actual   = "krb5-admin.stanford.edu"
+      $kpasswd_server_actual = "krb5-admin.stanford.edu"
+    }
+    'dev', 'test', 'uat', 'qa': {
+      $kdcs_actual = [
+        "krb5auth-${env}1.stanford.edu",
+        "krb5auth-${env}2.stanford.edu",
+        "krb5auth-${env}3.stanford.edu",
+        "krb5auth-${env}4.stanford.edu",
+      ]
+      $master_kdc_actual     = "master-kdc-${env}.stanford.edu"
+      $admin_server_actual   = "krb5-admin-${env}.stanford.edu"
+      $kpasswd_server_actual = "krb5-admin-${env}.stanford.edu"
+    }
+    'custom': {
+      $kdcs_actual           = $kdcs
+      $master_kdc_actual     = $master_kdc
+      $admin_server_actual   = $admin_server
+      $kpasswd_server_actual = $kpasswd_server
+    }
+    default : {
+      fail("do not know env '${env}'")
+    }
+  }
+
+  file { $name:
+    content => template('base/kerberos/etc/krb5.conf.erb'),
+  }
+}
diff --git a/templates/kerberos/etc/krb5.conf.erb b/templates/kerberos/etc/krb5.conf.erb
new file mode 100644
index 0000000000000000000000000000000000000000..dce58e888c09d7fd5d5c1ca4efd5b251230beebf
--- /dev/null
+++ b/templates/kerberos/etc/krb5.conf.erb
@@ -0,0 +1,211 @@
+# /etc/krb5.conf -- Kerberos V5 general configuration.
+#
+# This is the standard Kerberos v5 configuration file for all of our
+# servers.  It is based on the Stanford-wide configuration, the canonical
+# version of which is in /usr/pubsw/etc/krb5.conf.
+#
+# This configuration allows any enctypes.  Some systems with really old
+# Kerberos software may have to limit to triple-DES and DES.
+
+[appdefaults]
+    default_lifetime      = 25hrs
+    krb4_convert          = false
+    krb4_convert_524      = false
+
+    ksu = {
+        forwardable       = false
+    }
+
+    pam = {
+        minimum_uid       = 100
+        search_k5login    = true
+        forwardable       = true
+    }
+
+    pam-afs-session = {
+        minimum_uid       = 100
+    }
+
+    libkafs = {
+        IR.STANFORD.EDU = {
+            afs-use-524   = no
+        }
+    }
+
+    passwd_change = {
+        passwd_file       = /afs/ir.stanford.edu/service/etc/passwd.all
+        server            = password-change.stanford.edu
+        port              = 4443
+        service_principal = service/password-change@stanford.edu
+    }
+
+    wallet = {
+        wallet_server     = wallet.stanford.edu
+    }
+
+[libdefaults]
+    default_realm         = <%= @default_realm %>
+    ticket_lifetime       = 25h
+    renew_lifetime        = 7d
+    forwardable           = true
+    noaddresses           = true
+    allow_weak_crypto     = true
+<%- if (@rdns_enabled) then -%>
+    rdns                  = true
+<%- else -%>
+    rdns                  = false
+<%- end -%>
+<% if (@prefer_tcp) then -%>
+    udp_preference_limit  = 1
+<% end -%>
+
+[realms]
+    stanford.edu = {
+<%-
+    @kdcs_actual.each do |kdc|
+-%>
+        kdc            = <%= kdc %>:88
+<%-
+    end
+-%>
+        master_kdc     = <%= @master_kdc_actual %>:88
+        admin_server   = <%= @admin_server_actual %>
+        kpasswd_server = <%= @kpasswd_server_actual %>
+        default_domain = stanford.edu
+        kadmind_port   = 749
+    }
+    heimdal.stanford.edu = {
+        kdc            = kerberos-dev.stanford.edu:88
+        master_kdc     = kerberos-dev.stanford.edu:88
+        admin_server   = kerberos-dev.stanford.edu
+        kpasswd_server = kerberos-dev.stanford.edu
+        kadmind_port   = 749
+    }
+    WIN.STANFORD.EDU = {
+        kdc            = mothra.win.stanford.edu:88
+        kdc            = rodan.win.stanford.edu:88
+        kpasswd_server = mothra.win.stanford.edu
+    }
+    WINUAT.STANFORD.EDU = {
+        kdc            = winuatdc1.winuat.stanford.edu:88
+        kpasswd_server = winuatdc1.winuat.stanford.edu
+    }
+    NT.STANFORD.EDU = {
+        kdc            = ntdc2.nt.stanford.edu:88
+        kdc            = ntdc3.nt.stanford.edu:88
+        kpasswd_server = ntdc2.nt.stanford.edu
+    }
+    GUEST.STANFORD.EDU = {
+        kdc            = guestdc0.guest.stanford.edu:88
+        kdc            = guestdc1.guest.stanford.edu:88
+        kpasswd_server = guestdc0.guest.stanford.edu
+        default_domain = guest.stanford.edu
+    }
+    GUESTUAT.STANFORD.EDU = {
+        kdc            = guestuatdc0.guestuat.stanford.edu:88
+        kdc            = guestuatdc1.guestuat.stanford.edu:88
+        kpasswd_server = guestuatdc0.guestuat.stanford.edu
+        default_domain = guestuat.stanford.edu
+    }
+    CS.STANFORD.EDU = {
+        kdc            = cs-kdc-1.stanford.edu:88
+        kdc            = cs-kdc-2.stanford.edu:88
+        kdc            = cs-kdc-3.stanford.edu:88
+        admin_server   = cs-kdc-1.stanford.edu:749
+    }
+    SLAC.STANFORD.EDU = {
+        kdc            = k5auth1.slac.stanford.edu:88
+        kdc            = k5auth2.slac.stanford.edu:88
+        kdc            = k5auth3.slac.stanford.edu:88
+        admin_server   = k5admin.slac.stanford.edu
+        kpasswd_server = k5passwd.slac.stanford.edu
+        default_domain = slac.stanford.edu
+    }
+    WIN.SLAC.STANFORD.EDU = {
+        kdc            = winmaster2.win.slac.stanford.edu
+        default_domain = win.slac.stanford.edu
+    }
+    ATHENA.MIT.EDU = {
+        kdc            = kerberos.mit.edu:88
+        kdc            = kerberos-1.mit.edu:88
+        kdc            = kerberos-2.mit.edu:88
+        kdc            = kerberos-3.mit.edu:88
+        admin_server   = kerberos.mit.edu
+        default_domain = mit.edu
+    }
+    ISC.ORG = {
+        kdc            = k1.isc.org:88
+        kdc            = k2.isc.org:88
+        admin_server   = k1.isc.org:749
+        default_domain = isc.org
+    }
+    OPENLDAP.ORG = {
+        kdc            = kerberos.openldap.org
+        default_domain = openldap.org
+    }
+    SUCHDAMAGE.ORG = {
+        kdc            = kerberos.suchdamage.org:88
+        admin_server   = kerberos.suchdamage.org:749
+        default_domain = suchdamage.org
+    }
+    VIX.COM = {
+        kdc            = kerberos-0.vix.com:88
+        kdc            = kerberos-1.vix.com:88
+        kdc            = kerberos-2.vix.com:88
+        admin_server   = kerberos-0.vix.com:749
+        default_domain = vix.com
+    }
+    ZEPA.NET = {
+        kdc            = kerberos.zepa.net
+        kdc            = kerberos-too.zepa.net
+        admin_server   = kerberos.zepa.net
+    }
+
+[domain_realm]
+    stanford.edu                = stanford.edu
+    .stanford.edu               = stanford.edu
+    .dc.stanford.org            = stanford.edu
+    .sunet                      = stanford.edu
+    .eyrie.org                  = stanford.edu
+    .killfile.org               = stanford.edu
+    .lpch.net                   = stanford.edu
+    .lpch.org                   = stanford.edu
+    .oit.duke.edu               = stanford.edu
+    win.stanford.edu            = WIN.STANFORD.EDU
+    .win.stanford.edu           = WIN.STANFORD.EDU
+    daper.stanford.edu          = IT.WIN.STANFORD.EDU
+    gsbworkspace.stanford.edu   = IT.WIN.STANFORD.EDU
+    infraappprod.stanford.edu   = IT.WIN.STANFORD.EDU
+    radmed.stanford.edu         = IT.WIN.STANFORD.EDU
+    windows-new.stanford.edu    = IT.WIN.STANFORD.EDU
+    windows.stanford.edu        = IT.WIN.STANFORD.EDU
+    workspace.stanford.edu      = IT.WIN.STANFORD.EDU
+    winuat.stanford.edu         = WINUAT.STANFORD.EDU
+    .winuat.stanford.edu        = WINUAT.STANFORD.EDU
+    nt.stanford.edu             = NT.STANFORD.EDU
+    .nt.stanford.edu            = NT.STANFORD.EDU
+    guest.stanford.edu          = GUEST.STANFORD.EDU
+    .guest.stanford.edu         = GUEST.STANFORD.EDU
+    guest-mgmt.stanford.edu     = GUEST.STANFORD.EDU
+    guest-mgmt2.stanford.edu    = GUEST.STANFORD.EDU
+    guestidmweb.stanford.edu    = GUEST.STANFORD.EDU
+    guestuat.stanford.edu       = GUESTUAT.STANFORD.EDU
+    .guestuat.stanford.edu      = GUESTUAT.STANFORD.EDU
+    guestuat-mgmt.stanford.edu  = GUESTUAT.STANFORD.EDU
+    guestuatidmweb.stanford.edu = GUESTUAT.STANFORD.EDU
+    .slac.stanford.edu          = SLAC.STANFORD.EDU
+    .isc.org                    = ISC.ORG
+    mit.edu                     = ATHENA.MIT.EDU
+    .mit.edu                    = ATHENA.MIT.EDU
+    openldap.org                = OPENLDAP.ORG
+    .openldap.org               = OPENLDAP.ORG
+    whoi.edu                    = ATHENA.MIT.EDU
+    .whoi.edu                   = ATHENA.MIT.EDU
+    .vix.com                    = VIX.COM
+    zepa.net                    = ZEPA.NET
+    .zepa.net                   = ZEPA.NET
+
+[logging]
+    kdc          = SYSLOG:NOTICE
+    admin_server = SYSLOG:NOTICE
+    default      = SYSLOG:NOTICE