diff --git a/SOURCES/0001-daemon-if-no-local-users-check-if-machine-is-enrolle.patch b/SOURCES/0001-daemon-if-no-local-users-check-if-machine-is-enrolle.patch
new file mode 100644
index 0000000000000000000000000000000000000000..85f0faa2bd6d2ebad435b0e3090232fdb6c6f371
--- /dev/null
+++ b/SOURCES/0001-daemon-if-no-local-users-check-if-machine-is-enrolle.patch
@@ -0,0 +1,1907 @@
+From 967603c6823180b055c6f1b5e76b05c377076eda Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Fri, 13 Dec 2019 15:16:06 -0500
+Subject: [PATCH] daemon: if no local users, check if machine is enrolled in
+ network
+
+GDM will show gnome initial-setup if a machine has no local users.
+But it's totally possible that a machine has only remote users,
+and shouldn't have a local user.
+
+This commit detects that case, and avoids setting the HasNoUsers
+property.
+---
+ data/Makefile.am                |   1 +
+ data/org.freedesktop.realmd.xml | 730 ++++++++++++++++++++++++++++++++
+ src/Makefile.am                 |   5 +
+ src/daemon.c                    |  61 ++-
+ src/org.freedesktop.realmd.xml  | 730 ++++++++++++++++++++++++++++++++
+ 5 files changed, 1523 insertions(+), 4 deletions(-)
+ create mode 100644 data/org.freedesktop.realmd.xml
+ create mode 100644 src/org.freedesktop.realmd.xml
+
+diff --git a/data/Makefile.am b/data/Makefile.am
+index 521c6c2..6cf5e30 100644
+--- a/data/Makefile.am
++++ b/data/Makefile.am
+@@ -7,38 +7,39 @@ dbusif_DATA = \
+ dbusconfdir   = $(sysconfdir)/dbus-1/system.d
+ dbusconf_DATA = org.freedesktop.Accounts.conf
+ 
+ servicedir       = $(datadir)/dbus-1/system-services
+ service_in_files = org.freedesktop.Accounts.service.in
+ service_DATA     = $(service_in_files:.service.in=.service)
+ 
+ $(service_DATA): $(service_in_files) Makefile
+ 	@sed -e "s|\@libexecdir\@|$(libexecdir)|" $< >$@
+ 
+ policydir       = $(datadir)/polkit-1/actions
+ policy_in_files = org.freedesktop.accounts.policy.in
+ policy_DATA     = $(policy_in_files:.policy.in=.policy)
+ 
+ @INTLTOOL_POLICY_RULE@
+ 
+ if HAVE_SYSTEMD
+ systemdsystemunit_DATA = \
+ 	accounts-daemon.service
+ 
+ accounts-daemon.service: accounts-daemon.service.in
+ 	@sed -e "s|\@libexecdir\@|$(libexecdir)|" $< >$@
+ 
+ endif
+ 
+ EXTRA_DIST = 			\
+ 	$(dbusif_DATA)		\
+ 	$(dbusconf_DATA)	\
+ 	$(service_in_files)	\
+ 	$(policy_in_files)      \
++	org.freedesktop.realmd.xml	\
+ 	accounts-daemon.service.in
+ 
+ DISTCLEANFILES = 		\
+ 	$(service_DATA)		\
+ 	$(policy_DATA)
+ 
+ CLEANFILES = \
+ 	accounts-daemon.service
+diff --git a/data/org.freedesktop.realmd.xml b/data/org.freedesktop.realmd.xml
+new file mode 100644
+index 0000000..c34a47a
+--- /dev/null
++++ b/data/org.freedesktop.realmd.xml
+@@ -0,0 +1,730 @@
++<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
++ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
++<node name="/">
++
++	<!--
++	  org.freedesktop.realmd.Provider:
++	  @short_description: a realm provider
++
++	  Various realm providers represent different software implementations
++	  that provide access to realms or domains.
++
++	  This interface is implemented by individual providers, but is
++	  aggregated globally at the system bus name
++	  <literal>org.freedesktop.realmd</literal>
++	  with the object path <literal>/org/freedesktop/realmd</literal>
++	-->
++	<interface name="org.freedesktop.realmd.Provider">
++
++		<!--
++		  Name: the name of the provider
++
++		  The name of the provider. This is not normally displayed
++		  to the user, but may be useful for diagnostics or debugging.
++		-->
++		<property name="Name" type="s" access="read"/>
++
++		<!--
++		  Version: the version of the provider
++
++		  The version of the provider. This is not normally used in
++		  logic, but may be useful for diagnostics or debugging.
++		-->
++		<property name="Version" type="s" access="read"/>
++
++		<!--
++		  Realms: a list of realms
++
++		  A list of known, enrolled or discovered realms. All realms
++		  that this provider knows about are listed here. As realms
++		  are discovered they are added to this list.
++
++		  Each realm is represented by the DBus object path of the
++		  realm object.
++		-->
++		<property name="Realms" type="ao" access="read"/>
++
++		<!--
++		  Discover:
++		  @string: an input string to discover realms for
++		  @options: options for the discovery operation
++		  @relevance: the relevance of the returned results
++		  @realm: a list of realms discovered
++
++		  Discover realms for the given string. The input @string is
++		  usually a domain or realm name, perhaps typed by a user. If
++		  an empty string is provided, the realm provider should try to
++		  discover a default realm, if possible (e.g. from DHCP).
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		    <listitem><para><literal>client-software</literal>: a string
++		      containing the client software identifier that the returned
++		      realms should match.</para></listitem>
++		    <listitem><para><literal>server-software</literal>: a string
++		      containing the client software identifier that the returned
++		      realms should match.</para></listitem>
++		    <listitem><para><literal>membership-software</literal>: a string
++		      containing the membership software identifier that the returned
++		      realms should match.</para></listitem>
++		  </itemizedlist>
++
++		  The @relevance returned can be used to rank results from
++		  different discover calls to different providers. Implementors
++		  should return a positive number if the provider highly
++		  recommends that the realms be handled by this provider,
++		  or a zero if it can possibly handle the realms. Negative numbers
++		  should be returned if no realms are found.
++
++		  This method does not return an error when no realms are
++		  discovered. It simply returns an empty @realm list.
++
++		  To see diagnostic information about the discovery process,
++		  connect to the org.freedesktop.realmd.Service::Diagnostics
++		  signal.
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.discover-realm</literal>.
++
++		  In addition to common DBus error results, this method may
++		  return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the discovery could not be run for some reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to perform a discovery
++		      operation.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Discover">
++			<arg name="string" type="s" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++			<arg name="relevance" type="i" direction="out"/>
++			<arg name="realm" type="ao" direction="out"/>
++		</method>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.Service:
++	  @short_description: the realmd service
++
++	  Global calls for managing the realmd service. Usually you'll want
++	  to use #org.freedesktop.realmd.Provider instead.
++
++	  This interface is implemented by the realmd service, and is always
++	  available at the object path <literal>/org/freedesktop/realmd</literal>
++
++	  The service also implements the
++	  <literal>org.freedesktop.DBus.ObjectManager</literal> interface which
++	  makes it easy to retrieve all realmd objects and properties in one go.
++	-->
++	<interface name="org.freedesktop.realmd.Service">
++
++		<!--
++		  Cancel:
++		  @operation: the operation to cancel
++
++		  Cancel a realmd operation. To be able to cancel an operation,
++		  pass a uniquely chosen <literal>operation</literal> string
++		  identifier as an option in the method's <literal>options</literal>
++		  argument.
++
++		  These operation string identifiers should be unique per client
++		  calling the realmd service.
++
++		  It is not guaranteed that the service can or will cancel the
++		  operation. For example, the operation may have already completed
++		  by the time this method is handled. The caller of the operation
++		  method will receive a
++		  <literal>org.freedesktop.realmd.Error.Cancelled</literal>
++		  if the operation was cancelled.
++		-->
++		<method name="Cancel">
++			<arg name="operation" type="s" direction="in"/>
++		</method>
++
++		<!--
++		  SetLocale:
++		  @locale: the locale for the client
++
++		  Set the language @locale for the client. This locale is used
++		  for error messages. The locale is used until the next time
++		  this method is called, the client disconnects, or the client
++		  calls #org.freedesktop.realmd.Service.Release().
++		-->
++		<method name="SetLocale">
++			<arg name="locale" type="s" direction="in"/>
++		</method>
++
++		<!--
++		  Diagnostics:
++		  @data: diagnostic data
++		  @operation: the operation this data resulted from
++
++		  This signal is fired when diagnostics result from an operation
++		  in the provider or one of its realms.
++
++		  It is not guaranteed that this signal is emitted once per line.
++		  More than one line may be contained in @data, or a partial
++		  line. New line characters are embedded in @data.
++
++		  This signal is sent explicitly to the client which invoked an
++		  operation method. In order to tell which operation this
++		  diagnostic data results from, pass a unique
++		  <literal>operation</literal> string identifier in the
++		  <literal>options</literal> argument of the operation method.
++		  That same identifier will be passed back via the @operation
++		  argument of this signal.
++		-->
++		<signal name="Diagnostics">
++			<arg name="data" type="s"/>
++			<arg name="operation" type="s"/>
++		</signal>
++
++		<!--
++		  Release:
++
++		  Normally, realmd waits until all clients have disconnected
++		  before exiting itself sometime later. Long lived clients
++		  can call this method to allow the realmd service to quit.
++		  This is an optimization. The daemon will not exit immediately.
++		  It is safe to call this multiple times.
++		-->
++		<method name="Release">
++			<!-- no arguments -->
++		</method>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.Realm:
++	  @short_description: a realm
++
++	  Represents one realm.
++
++	  Contains generic information about a realm, and useful properties for
++	  introspecting what kind of realm this is and how to work with
++	  the realm.
++
++	  Use #org.freedesktop.realmd.Provider:Realms or
++	  #org.freedesktop.realmd.Provider.Discover() to get access to some
++	  kerberos realm objects.
++
++	  Realms will always implement additional interfaces, such as
++	  #org.freedesktop.realmd.Kerberos.  Do not assume that all realms
++	  implement that kerberos interface. Use the
++	  #org.freedesktop.realmd.Realm:SupportedInterfaces property to see
++	  which interfaces are supported.
++
++	  Different realms support various ways to configure them on the
++	  system. Use the #org.freedesktop.realmd.Realm:Configured property
++	  to determine if a realm is configured. If it is configured, the
++	  property will be set to the interface of the mechanism that was
++	  used to configure it.
++
++	  To configure a realm, look in the
++	  #org.freedesktop.realmd.Realm:SupportedInterfaces property for a
++	  recognized purpose-specific interface that can be used for
++	  configuration, such as the
++	  #org.freedesktop.realmd.KerberosMembership interface and its
++	  #org.freedesktop.realmd.KerberosMembership.Join() method.
++
++	  To deconfigure a realm from the current system, you can use the
++	  #org.freedesktop.realmd.Realm.Deconfigure() method. In addition, some
++	  of the configuration specific interfaces provide methods to
++	  deconfigure a realm in a specific way, such as the
++	  #org.freedesktop.realmd.KerberosMembership.Leave() method.
++
++	  The various properties are guaranteed to have been updated before
++	  the operation methods return, if they change state.
++	-->
++	<interface name="org.freedesktop.realmd.Realm">
++
++		<!--
++		  Name: the realm name
++
++		  This is the name of the realm, appropriate for display to
++		  end users where necessary.
++		-->
++		<property name="Name" type="s" access="read"/>
++
++		<!--
++		  Configured: whether this domain is configured and how
++
++		  If this property is an empty string, then the realm is not
++		  configured. Otherwise the realm is configured, and contains
++		  a string which is the interface that represents how it was
++		  configured, for example #org.freedesktop.realmd.KerberosMembership.
++		-->
++		<property name="Configured" type="s" access="read"/>
++
++		<!--
++		  Deconfigure: deconfigure this realm
++
++		  Deconfigure this realm from the local machine with standard
++		  default behavior.
++
++		  The behavior of this method depends on the which configuration
++		  interface is present in the
++		  #org.freedesktop.realmd.Realm.Configured property. It does not
++		  always delete membership accounts in the realm, but just
++		  reconfigures the local machine so it no longer is configured
++		  for the given realm. In some cases the implementation may try
++		  to update membership accounts, but this is not guaranteed.
++
++		  Various configuration interfaces may support more specific ways
++		  to deconfigure a realm in a specific way, such as the
++		  #org.freedesktop.realmd.KerberosMembership.Leave() method.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.deconfigure-realm</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the deconfigure failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to deconfigure a
++		      realm.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotConfigured</literal>:
++		      returned if this realm is not configured on the machine.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Deconfigure">
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++		<!--
++		  SupportedInterfaces:
++
++		  Additional supported interfaces of this realm. This includes
++		  interfaces that contain more information about the realm,
++		  such as #org.freedesktop.realmd.Kerberos and interfaces
++		  which contain methods for configuring a realm, such as
++		  #org.freedesktop.realmd.KerberosMembership.
++		-->
++		<property name="SupportedInterfaces" type="as" access="read"/>
++
++		<!--
++		  Details: informational details about the realm
++
++		  Informational details about the realm. The following values
++		  should be present:
++		  <itemizedlist>
++		    <listitem><para><literal>server-software</literal>:
++		      identifier of the software running on the server (e.g.
++		      <literal>active-directory</literal>).</para></listitem>
++		    <listitem><para><literal>client-software</literal>:
++		      identifier of the software running on the client (e.g.
++		      <literal>sssd</literal>).</para></listitem>
++		  </itemizedlist>
++		-->
++		<property name="Details" type="a(ss)" access="read"/>
++
++		<!--
++		  RequiredPackages: prerequisite software
++
++		  Software packages that are required in order for a join to
++		  succeed. These are either simple strings like <literal>sssd</literal>,
++		  or strings with an operator and version number like
++		  <literal>sssd >= 1.9.0</literal>
++
++		  These values are specific to the packaging system that is
++		  being run.
++		-->
++		<property name="RequiredPackages" type="as" access="read"/>
++
++		<!--
++		  LoginFormats: supported formats for login names
++
++		  Supported formats for login to this realm. This is only
++		  relevant once the realm has been enrolled. The formats
++		  will contain a <literal>%U</literal> in the string, which
++		  indicate where the user name should be placed. The formats
++		  may contain a <literal>%D</literal> in the string which
++		  indicate where a domain name should be placed.
++
++		  The first format in the list is the preferred format for
++		  login names.
++		-->
++		<property name="LoginFormats" type="as" access="read"/>
++
++		<!--
++		  LoginPolicy: the policy for logins using this realm
++
++		  The policy for logging into this computer using this realm.
++
++		  The policy can be changed using the
++		  #org.freedesktop.realmd.Realm.ChangeLoginPolicy() method.
++
++		  The following policies are predefined. Not all providers
++		  support all these policies and there may be provider specific
++		  policies or multiple policies represented in the string:
++		  <itemizedlist>
++		    <listitem><para><literal>allow-any-login</literal>: allow
++		      login by any authenticated user present in this
++		      realm.</para></listitem>
++		    <listitem><para><literal>allow-realm-logins</literal>: allow
++		      logins according to the realm or domain policy for logins
++		      on this machine. This usually defaults to allowing any realm
++		      user to log in.</para></listitem>
++		    <listitem><para><literal>allow-permitted-logins</literal>:
++		      only allow the logins permitted in the
++		      #org.freedesktop.realmd.Realm:PermittedLogins
++		      property.</para></listitem>
++		    <listitem><para><literal>deny-any-login</literal>:
++		      don't allow any logins via authenticated users of this
++		      realm.</para></listitem>
++		  </itemizedlist>
++		-->
++		<property name="LoginPolicy" type="s" access="read"/>
++
++		<!--
++		  PermittedLogins: the permitted login names
++
++		  The list of permitted authenticated users allowed to login
++		  into this computer. This is only relevant if the
++		  #org.freedesktop.realmd.Realm:LoginPolicy property
++		  contains the <literal>allow-permitted-logins</literal>
++		  string.
++		-->
++		<property name="PermittedLogins" type="as" access="read"/>
++
++		<!--
++		  PermittedGroups: the permitted group names
++
++		  The list of groups which users need to be in to be allowed
++		  to log into this computer. This is only relevant if the
++		  #org.freedesktop.realmd.Realm:LoginPolicy property
++		  contains the <literal>allow-permitted-logins</literal>
++		  string.
++		-->
++		<property name="PermittedGroups" type="as" access="read"/>
++
++		<!--
++		  ChangeLoginPolicy:
++		  @login_policy: the new login policy, or an empty string
++		  @permitted_add: a list of logins to permit
++		  @permitted_remove: a list of logins to not permit
++		  @options: options for this operation
++
++		  Change the login policy and/or permitted logins for this realm.
++
++		  Not all realms support all the various login policies. An
++		  error will be returned if the new login policy is not supported.
++		  You may specify an empty string for the @login_policy argument
++		  which will cause no change in the policy itself. If the policy
++		  is changed, it will be reflected in the
++		  #org.freedesktop.realmd.Realm:LoginPolicy property.
++
++		  The @permitted_add and @permitted_remove arguments represent
++		  lists of login names that should be added and removed from
++		  the #org.freedesktop.realmd.Kerberos:PermittedLogins property.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		    <listitem><para><literal>groups</literal>: boolean which if
++		    set to <literal>TRUE</literal> means that the names in
++		    @permitted_add and @permitted_remove are group names instead
++		    of login names.</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.login-policy</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the policy change failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to change login policy
++		      operation.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotConfigured</literal>:
++		      returned if the realm is not configured.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="ChangeLoginPolicy">
++			<arg name="login_policy" type="s" direction="in"/>
++			<arg name="permitted_add" type="as" direction="in"/>
++			<arg name="permitted_remove" type="as" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.Kerberos:
++	  @short_description: a kerberos realm
++
++	  An interface that describes a kerberos realm in more detail. This
++	  is always implemented on an DBus object path that also implements
++	  the #org.freedesktop.realmd.Realm interface.
++	-->
++	<interface name="org.freedesktop.realmd.Kerberos">
++
++		<!--
++		  RealmName: the kerberos realm name
++
++		  The kerberos name for this realm. This is usually in upper
++		  case.
++		-->
++		<property name="RealmName" type="s" access="read"/>
++
++		<!--
++		  DomainName: the DNS domain name
++
++		  The DNS domain name for this realm.
++		-->
++		<property name="DomainName" type="s" access="read"/>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.KerberosMembership:
++
++	  An interface used to configure this machine by joining a realm.
++
++	  It sets up a computer/host account in the realm for this machine
++	  and a keytab to track the credentials for that account.
++
++	  The various properties are guaranteed to have been updated before
++	  the operation methods return, if they change state.
++	-->
++	<interface name="org.freedesktop.realmd.KerberosMembership">
++
++		<!--
++		  SuggestedAdministrator: common administrator name
++
++		  The common administrator name for this type of realm. This
++		  can be used by clients as a hint when prompting the user for
++		  administrative authentication.
++		-->
++		<property name="SuggestedAdministrator" type="s" access="read"/>
++
++		<!--
++		  SupportedJoinCredentials: credentials supported for joining
++
++		  Various kinds of credentials that are supported when calling the
++		  #org.freedesktop.realmd.Kerberos.Join() method.
++
++		  Each credential is represented by a type and an owner. The type
++		  denotes which kind of credential is passed to the method. The
++		  owner indicates to the client how to prompt the user or obtain
++		  the credential, and to the service how to use the credential.
++
++		  The various types are:
++		  <itemizedlist>
++		    <listitem><para><literal>ccache</literal>:
++		      the credentials should contain an array of bytes as a
++		      <literal>ay</literal> containing the data from a kerberos
++		      credential cache file.</para></listitem>
++		    <listitem><para><literal>password</literal>:
++		      the credentials should contain a pair of strings as a
++		      <literal>(ss)</literal> representing a name and
++		      password. The name may contain a realm in the standard
++		      kerberos format. If a realm is missing, it will default
++		      to this realm. </para></listitem>
++		    <listitem><para><literal>secret</literal>:
++		      the credentials should contain a string secret as an
++		      <literal>ay</literal> array of bytes. This is usually used
++		      for one time passwords. To pass a string here, encode it
++		      in UTF-8, and place the resulting bytes in the
++		      value.</para></listitem>
++		    <listitem><para><literal>automatic</literal>:
++		      the credentials should contain an empty string as a
++		      <literal>s</literal>. Using <literal>automatic</literal>
++		      indicates that default or system credentials are to be
++		      used.</para></listitem>
++		  </itemizedlist>
++
++		  The various owners are:
++		  <itemizedlist>
++		    <listitem><para><literal>administrator</literal>:
++		      the credentials belong to a kerberos administrator principal.
++		      The caller may use this as a hint to prompt the user
++		      for administrative credentials.</para></listitem>
++		    <listitem><para><literal>user</literal>:
++		      the credentials belong to a kerberos user principal.
++		      The caller may use this as a hint to prompt the user
++		      for his (possibly non-administrative)
++		      credentials.</para></listitem>
++		    <listitem><para><literal>computer</literal>:
++		      the credentials belong to a computer account.</para></listitem>
++		    <listitem><para><literal>none</literal>:
++		      the credentials have an unspecified owner, such as a one
++		      time password.</para></listitem>
++		  </itemizedlist>
++		-->
++		<property name="SupportedJoinCredentials" type="a(ss)" access="read"/>
++
++		<!--
++		  SupportedLeaveCredentials: credentials supported for leaving
++
++		  Various kinds of credentials that are supported when calling the
++		  #org.freedesktop.realmd.Kerberos.Leave() method.
++
++		  See #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials for
++		  a discussion of what the values represent.
++		-->
++		<property name="SupportedLeaveCredentials" type="a(ss)" access="read"/>
++
++		<!--
++		  Join:
++
++		  Join this machine to the realm and enroll the machine.
++
++		  If this method returns successfully, then the machine will be
++		  joined to the realm. It is not necessary to restart services or the
++		  machine afterward. Relevant properties on the realm will be updated
++		  before the method returns.
++
++		  The @credentials should be set according to one of the
++		  supported credentials returned by
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials.
++		  The first string in the tuple is the type, the second string
++		  is the owner, and the variant contains the credential contents
++		  See the discussion at
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials
++		  for more information.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++                    <listitem><para><literal>automatic-id-mapping</literal>: a boolean
++                      value whether to turn on automatic UID/GID mapping. If not
++		      specified the default will come from realmd.conf
++                      configuration.</para></listitem>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		    <listitem><para><literal>computer-ou</literal>: a string
++		      containing an LDAP DN for an organizational unit where the
++		      computer account should be created</para></listitem>
++		    <listitem><para><literal>user-principal</literal>: a string
++		      containing an kerberos user principal name to be set on the
++		      computer account</para></listitem>
++		    <listitem><para><literal>membership-software</literal>: a string
++		      containing the membership software identifier that the returned
++		      realms should match.</para></listitem>
++		    <listitem><para><literal>manage-system</literal>: a boolean
++		      which controls whether this machine should be managed by
++		      the realm or domain or not. Defaults to true.</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.configure-realm</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the join failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to perform a join
++		      operation.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.AuthenticationFailed</literal>:
++		      returned if the credentials passed did not authenticate against the realm
++		      correctly. It is appropriate to prompt the user again.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.AlreadyEnrolled</literal>:
++		      returned if already enrolled in this realm, or if already enrolled in another realm
++		      (if enrolling in multiple realms is not supported).</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.BadHostname</literal>:
++		      returned if the machine has a hostname that is not usable for a join
++		      or is in conflict with those in the domain.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Join">
++			<arg name="credentials" type="(ssv)" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++		<!--
++		  Leave:
++
++		  Leave the realm and unenroll the machine.
++
++		  If this method returns successfully, then the machine will have
++		  left the domain and been unenrolled. It is not necessary to restart
++		  services or the machine afterward. Relevant properties on the realm
++		  will be updated before the method returns.
++
++		  The @credentials should be set according to one of the
++		  supported credentials returned by
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials.
++		  The first string in the tuple is the type, the second string
++		  is the owner, and the variant contains the credential contents
++		  See the discussion at
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials
++		  for more information.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.deconfigure-realm</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the unenroll failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to perform an unenroll
++		      operation.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.AuthenticationFailed</literal>:
++		      returned if the credentials passed did not authenticate against the realm
++		      correctly. It is appropriate to prompt the user again.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotEnrolled</literal>:
++		      returned if not enrolled in this realm.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Leave">
++			<arg name="credentials" type="(ssv)" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++	</interface>
++
++</node>
+diff --git a/src/Makefile.am b/src/Makefile.am
+index f53e3e1..7a5b382 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -1,59 +1,64 @@
+ NULL =
+ BUILT_SOURCES =
+ SUBDIRS = . libaccountsservice
+ INCLUDES = 			\
+ 	-DLOCALSTATEDIR=\""$(localstatedir)"\" \
+ 	-DDATADIR=\""$(datadir)"\" \
+ 	-DICONDIR=\"$(localstatedir)/lib/AccountsService/icons\" \
+ 	-DUSERDIR=\"$(localstatedir)/lib/AccountsService/users\" \
+ 	-I$(srcdir)		\
+ 	-I$(builddir)		\
+ 	$(ACCOUNTS_DAEMON_CFLAGS)	\
+ 	$(WARN_CFLAGS)
+ 
+ noinst_LTLIBRARIES = libaccounts-generated.la
+ 
+ libaccounts_generated_la_SOURCES = \
+ 	accounts-generated.c		\
+ 	accounts-generated.h		\
+ 	accounts-user-generated.c	\
+ 	accounts-user-generated.h	\
++	realmd-generated.c		\
++	realmd-generated.h		\
+ 	$(NULL)
+ BUILT_SOURCES += $(libaccounts_generated_la_SOURCES)
+ 
+ accounts-generated.c accounts-generated.h: $(top_srcdir)/data/org.freedesktop.Accounts.xml Makefile
+ 	gdbus-codegen --generate-c-code accounts-generated --c-namespace Accounts --interface-prefix=org.freedesktop. $(top_srcdir)/data/org.freedesktop.Accounts.xml
+ 
+ accounts-user-generated.c accounts-user-generated.h: $(top_srcdir)/data/org.freedesktop.Accounts.User.xml Makefile
+ 	gdbus-codegen --generate-c-code accounts-user-generated --c-namespace Accounts --interface-prefix=org.freedesktop.Accounts. $(top_srcdir)/data/org.freedesktop.Accounts.User.xml
+ 
++realmd-generated.c realmd-generated.h: $(top_srcdir)/data/org.freedesktop.realmd.xml Makefile
++	gdbus-codegen --c-generate-autocleanup all --c-generate-object-manager --generate-c-code realmd-generated --c-namespace Accounts --interface-prefix=org.freedesktop. $(top_srcdir)/data/org.freedesktop.realmd.xml
++
+ libexec_PROGRAMS = accounts-daemon
+ 
+ accounts_daemon_SOURCES = 	\
+ 	$(enums_h_sources)	\
+ 	types.h			\
+ 	daemon.h		\
+ 	daemon.c		\
+ 	extensions.c		\
+ 	user-classify.h		\
+ 	user-classify.c		\
+ 	user.h			\
+ 	user.c			\
+ 	util.h			\
+ 	util.c			\
+ 	wtmp-helper.h		\
+ 	wtmp-helper.c		\
+ 	main.c
+ 
+ accounts_daemon_LDADD = 	\
+ 	libaccounts-generated.la	\
+ 	$(ACCOUNTS_DAEMON_LIBS)
+ 
+ EXTRA_DIST = \
+ 	fgetpwent.c	\
+ 	$(NULL)
+ 
+ CLEANFILES = \
+ 	$(BUILT_SOURCES) \
+ 	*.gcda \
+ 	*.gcno \
+diff --git a/src/daemon.c b/src/daemon.c
+index 00dff51..23e60ce 100644
+--- a/src/daemon.c
++++ b/src/daemon.c
+@@ -20,60 +20,61 @@
+  * Written by: Matthias Clasen <mclasen@redhat.com>
+  */
+ 
+ #include "config.h"
+ 
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+ #include <sys/wait.h>
+ #include <pwd.h>
+ #ifdef HAVE_SHADOW_H
+ #include <shadow.h>
+ #endif
+ #include <unistd.h>
+ #include <errno.h>
+ #include <sys/types.h>
+ 
+ #include <glib.h>
+ #include <glib/gi18n.h>
+ #include <glib-object.h>
+ #include <glib/gstdio.h>
+ #include <gio/gio.h>
+ #include <polkit/polkit.h>
+ 
+ #include "user-classify.h"
+ #include "wtmp-helper.h"
+ #include "daemon.h"
+ #include "util.h"
++#include "realmd-generated.h"
+ 
+ #define PATH_PASSWD "/etc/passwd"
+ #define PATH_SHADOW "/etc/shadow"
+ #define PATH_GROUP "/etc/group"
+ 
+ enum {
+         PROP_0,
+         PROP_DAEMON_VERSION
+ };
+ 
+ struct DaemonPrivate {
+         GDBusConnection *bus_connection;
+ 
+         GHashTable *users;
+         gsize number_of_normal_users;
+         GList *explicitly_requested_users;
+ 
+         User *autologin;
+ 
+         GFileMonitor *passwd_monitor;
+         GFileMonitor *shadow_monitor;
+         GFileMonitor *group_monitor;
+         GFileMonitor *gdm_monitor;
+         GFileMonitor *wtmp_monitor;
+ 
+         guint reload_id;
+         guint autologin_id;
+ 
+         PolkitAuthority *authority;
+         GHashTable *extension_ifaces;
+@@ -414,109 +415,164 @@ load_entries (Daemon             *daemon,
+                         } else {
+                                 g_object_ref (user);
+                         }
+ 
+                         /* freeze & update users not already in the new list */
+                         g_object_freeze_notify (G_OBJECT (user));
+                         user_update_from_pwent (user, pwent, spent);
+ 
+                         g_hash_table_insert (users, g_strdup (user_get_user_name (user)), user);
+                         g_debug ("loaded user: %s", user_get_user_name (user));
+                 }
+ 
+                 if (!explicitly_requested) {
+                         user_set_cached (user, TRUE);
+                 }
+         }
+ 
+         /* Generator should have cleaned up */
+         g_assert (generator_state == NULL);
+ }
+ 
+ static GHashTable *
+ create_users_hash_table (void)
+ {
+         return g_hash_table_new_full (g_str_hash,
+                                       g_str_equal,
+                                       g_free,
+                                       g_object_unref);
+ }
+ 
++static gboolean
++ensure_bus_connection (Daemon *daemon)
++{
++        g_autoptr (GError) error = NULL;
++
++        if (daemon->priv->bus_connection != NULL)
++                return TRUE;
++
++        daemon->priv->bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
++        if (daemon->priv->bus_connection == NULL) {
++                if (error != NULL)
++                        g_critical ("error getting system bus: %s", error->message);
++                return FALSE;
++        }
++
++        return TRUE;
++}
++
++static gboolean
++has_network_realms (Daemon *daemon)
++{
++        g_autoptr (AccountsRealmdProvider) realmd_provider = NULL;
++        g_autoptr (GError) error = NULL;
++        const char *const *realms = NULL;
++
++        if (!ensure_bus_connection (daemon)) {
++                return FALSE;
++        }
++
++        realmd_provider = accounts_realmd_provider_proxy_new_sync (daemon->priv->bus_connection,
++                                                                   G_DBUS_PROXY_FLAGS_NONE,
++                                                                   "org.freedesktop.realmd",
++                                                                   "/org/freedesktop/realmd",
++                                                                   NULL,
++                                                                   &error);
++        if (realmd_provider == NULL) {
++                g_debug ("failed to contact realmd: %s", error->message);
++                return FALSE;
++        }
++
++        realms = accounts_realmd_provider_get_realms (realmd_provider);
++
++        if (!realms) {
++                g_debug("realmd provider 'Realms' property is unset");
++                return FALSE;
++        }
++
++        return realms[0] != NULL;
++}
++
+ static void
+ reload_users (Daemon *daemon)
+ {
+         AccountsAccounts *accounts = ACCOUNTS_ACCOUNTS (daemon);
+         gboolean had_no_users, has_no_users, had_multiple_users, has_multiple_users;
+         GHashTable *users;
+         GHashTable *old_users;
+         GHashTable *local;
+         GHashTableIter iter;
+         gsize number_of_normal_users = 0;
+         gpointer name, value;
+ 
+         /* Track the users that we saw during our (re)load */
+         users = create_users_hash_table ();
+ 
+         /*
+          * NOTE: As we load data from all the sources, notifies are
+          * frozen in load_entries() and then thawed as we process
+          * them below.
+          */
+ 
+         /* Load the local users into our hash table */
+         load_entries (daemon, users, FALSE, entry_generator_fgetpwent);
+         local = g_hash_table_new (g_str_hash, g_str_equal);
+         g_hash_table_iter_init (&iter, users);
+         while (g_hash_table_iter_next (&iter, &name, NULL))
+                 g_hash_table_add (local, name);
+ 
+         /* and add users to hash table that were explicitly requested  */
+         load_entries (daemon, users, TRUE, entry_generator_requested_users);
+ 
+         /* Now add/update users from other sources, possibly non-local */
+         load_entries (daemon, users, FALSE, entry_generator_cachedir);
+ 
+         wtmp_helper_update_login_frequencies (users);
+ 
+         /* Count the non-system users. Mark which users are local, which are not. */
+         g_hash_table_iter_init (&iter, users);
+         while (g_hash_table_iter_next (&iter, &name, &value)) {
+                 User *user = value;
+                 if (!user_get_system_account (user))
+                         number_of_normal_users++;
+                 user_update_local_account_property (user, g_hash_table_lookup (local, name) != NULL);
+         }
+         g_hash_table_destroy (local);
+ 
+         had_no_users = accounts_accounts_get_has_no_users (accounts);
+         has_no_users = number_of_normal_users == 0;
+ 
++        if (has_no_users && has_network_realms (daemon)) {
++                g_debug ("No local users, but network realms detected, presuming there are remote users");
++                has_no_users = FALSE;
++        }
++
+         if (had_no_users != has_no_users)
+                 accounts_accounts_set_has_no_users (accounts, has_no_users);
+ 
+         had_multiple_users = accounts_accounts_get_has_multiple_users (accounts);
+         has_multiple_users = number_of_normal_users > 1;
+ 
+         if (had_multiple_users != has_multiple_users)
+                 accounts_accounts_set_has_multiple_users (accounts, has_multiple_users);
+ 
+         /* Swap out the users */
+         old_users = daemon->priv->users;
+         daemon->priv->users = users;
+ 
+         /* Remove all the old users */
+         g_hash_table_iter_init (&iter, old_users);
+         while (g_hash_table_iter_next (&iter, &name, &value)) {
+                 User *user = value;
+                 User *refreshed_user;
+ 
+                 refreshed_user = g_hash_table_lookup (users, name);
+ 
+                 if (!refreshed_user || (user_get_cached (user) && !user_get_cached (refreshed_user))) {
+                         accounts_accounts_emit_user_deleted (ACCOUNTS_ACCOUNTS (daemon),
+                                                              user_get_object_path (user));
+                         user_unregister (user);
+                 }
+         }
+ 
+         /* Register all the new users */
+         g_hash_table_iter_init (&iter, users);
+@@ -733,64 +789,61 @@ daemon_finalize (GObject *object)
+         Daemon *daemon;
+ 
+         g_return_if_fail (IS_DAEMON (object));
+ 
+         daemon = DAEMON (object);
+ 
+         if (daemon->priv->bus_connection != NULL)
+                 g_object_unref (daemon->priv->bus_connection);
+ 
+         g_list_free_full (daemon->priv->explicitly_requested_users, g_free);
+ 
+         g_hash_table_destroy (daemon->priv->users);
+ 
+         g_hash_table_unref (daemon->priv->extension_ifaces);
+ 
+         G_OBJECT_CLASS (daemon_parent_class)->finalize (object);
+ }
+ 
+ static gboolean
+ register_accounts_daemon (Daemon *daemon)
+ {
+         g_autoptr(GError) error = NULL;
+ 
+         daemon->priv->authority = polkit_authority_get_sync (NULL, &error);
+         if (daemon->priv->authority == NULL) {
+                 if (error != NULL)
+                         g_critical ("error getting polkit authority: %s", error->message);
+                 return FALSE;
+         }
+ 
+-        daemon->priv->bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+-        if (daemon->priv->bus_connection == NULL) {
+-                if (error != NULL)
+-                        g_critical ("error getting system bus: %s", error->message);
++        if (!ensure_bus_connection (daemon)) {
+                 return FALSE;
+         }
+ 
+         if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (daemon),
+                                                daemon->priv->bus_connection,
+                                                "/org/freedesktop/Accounts",
+                                                &error)) {
+                 if (error != NULL)
+                         g_critical ("error exporting interface: %s", error->message);
+                 return FALSE;
+         }
+ 
+         return TRUE;
+ }
+ 
+ Daemon *
+ daemon_new (void)
+ {
+         g_autoptr(Daemon) daemon = NULL;
+ 
+         daemon = DAEMON (g_object_new (TYPE_DAEMON, NULL));
+ 
+         if (!register_accounts_daemon (DAEMON (daemon))) {
+                 return NULL;
+         }
+ 
+         return g_steal_pointer (&daemon);
+ }
+ 
+ static void
+diff --git a/src/org.freedesktop.realmd.xml b/src/org.freedesktop.realmd.xml
+new file mode 100644
+index 0000000..c34a47a
+--- /dev/null
++++ b/src/org.freedesktop.realmd.xml
+@@ -0,0 +1,730 @@
++<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
++ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
++<node name="/">
++
++	<!--
++	  org.freedesktop.realmd.Provider:
++	  @short_description: a realm provider
++
++	  Various realm providers represent different software implementations
++	  that provide access to realms or domains.
++
++	  This interface is implemented by individual providers, but is
++	  aggregated globally at the system bus name
++	  <literal>org.freedesktop.realmd</literal>
++	  with the object path <literal>/org/freedesktop/realmd</literal>
++	-->
++	<interface name="org.freedesktop.realmd.Provider">
++
++		<!--
++		  Name: the name of the provider
++
++		  The name of the provider. This is not normally displayed
++		  to the user, but may be useful for diagnostics or debugging.
++		-->
++		<property name="Name" type="s" access="read"/>
++
++		<!--
++		  Version: the version of the provider
++
++		  The version of the provider. This is not normally used in
++		  logic, but may be useful for diagnostics or debugging.
++		-->
++		<property name="Version" type="s" access="read"/>
++
++		<!--
++		  Realms: a list of realms
++
++		  A list of known, enrolled or discovered realms. All realms
++		  that this provider knows about are listed here. As realms
++		  are discovered they are added to this list.
++
++		  Each realm is represented by the DBus object path of the
++		  realm object.
++		-->
++		<property name="Realms" type="ao" access="read"/>
++
++		<!--
++		  Discover:
++		  @string: an input string to discover realms for
++		  @options: options for the discovery operation
++		  @relevance: the relevance of the returned results
++		  @realm: a list of realms discovered
++
++		  Discover realms for the given string. The input @string is
++		  usually a domain or realm name, perhaps typed by a user. If
++		  an empty string is provided, the realm provider should try to
++		  discover a default realm, if possible (e.g. from DHCP).
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		    <listitem><para><literal>client-software</literal>: a string
++		      containing the client software identifier that the returned
++		      realms should match.</para></listitem>
++		    <listitem><para><literal>server-software</literal>: a string
++		      containing the client software identifier that the returned
++		      realms should match.</para></listitem>
++		    <listitem><para><literal>membership-software</literal>: a string
++		      containing the membership software identifier that the returned
++		      realms should match.</para></listitem>
++		  </itemizedlist>
++
++		  The @relevance returned can be used to rank results from
++		  different discover calls to different providers. Implementors
++		  should return a positive number if the provider highly
++		  recommends that the realms be handled by this provider,
++		  or a zero if it can possibly handle the realms. Negative numbers
++		  should be returned if no realms are found.
++
++		  This method does not return an error when no realms are
++		  discovered. It simply returns an empty @realm list.
++
++		  To see diagnostic information about the discovery process,
++		  connect to the org.freedesktop.realmd.Service::Diagnostics
++		  signal.
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.discover-realm</literal>.
++
++		  In addition to common DBus error results, this method may
++		  return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the discovery could not be run for some reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to perform a discovery
++		      operation.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Discover">
++			<arg name="string" type="s" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++			<arg name="relevance" type="i" direction="out"/>
++			<arg name="realm" type="ao" direction="out"/>
++		</method>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.Service:
++	  @short_description: the realmd service
++
++	  Global calls for managing the realmd service. Usually you'll want
++	  to use #org.freedesktop.realmd.Provider instead.
++
++	  This interface is implemented by the realmd service, and is always
++	  available at the object path <literal>/org/freedesktop/realmd</literal>
++
++	  The service also implements the
++	  <literal>org.freedesktop.DBus.ObjectManager</literal> interface which
++	  makes it easy to retrieve all realmd objects and properties in one go.
++	-->
++	<interface name="org.freedesktop.realmd.Service">
++
++		<!--
++		  Cancel:
++		  @operation: the operation to cancel
++
++		  Cancel a realmd operation. To be able to cancel an operation,
++		  pass a uniquely chosen <literal>operation</literal> string
++		  identifier as an option in the method's <literal>options</literal>
++		  argument.
++
++		  These operation string identifiers should be unique per client
++		  calling the realmd service.
++
++		  It is not guaranteed that the service can or will cancel the
++		  operation. For example, the operation may have already completed
++		  by the time this method is handled. The caller of the operation
++		  method will receive a
++		  <literal>org.freedesktop.realmd.Error.Cancelled</literal>
++		  if the operation was cancelled.
++		-->
++		<method name="Cancel">
++			<arg name="operation" type="s" direction="in"/>
++		</method>
++
++		<!--
++		  SetLocale:
++		  @locale: the locale for the client
++
++		  Set the language @locale for the client. This locale is used
++		  for error messages. The locale is used until the next time
++		  this method is called, the client disconnects, or the client
++		  calls #org.freedesktop.realmd.Service.Release().
++		-->
++		<method name="SetLocale">
++			<arg name="locale" type="s" direction="in"/>
++		</method>
++
++		<!--
++		  Diagnostics:
++		  @data: diagnostic data
++		  @operation: the operation this data resulted from
++
++		  This signal is fired when diagnostics result from an operation
++		  in the provider or one of its realms.
++
++		  It is not guaranteed that this signal is emitted once per line.
++		  More than one line may be contained in @data, or a partial
++		  line. New line characters are embedded in @data.
++
++		  This signal is sent explicitly to the client which invoked an
++		  operation method. In order to tell which operation this
++		  diagnostic data results from, pass a unique
++		  <literal>operation</literal> string identifier in the
++		  <literal>options</literal> argument of the operation method.
++		  That same identifier will be passed back via the @operation
++		  argument of this signal.
++		-->
++		<signal name="Diagnostics">
++			<arg name="data" type="s"/>
++			<arg name="operation" type="s"/>
++		</signal>
++
++		<!--
++		  Release:
++
++		  Normally, realmd waits until all clients have disconnected
++		  before exiting itself sometime later. Long lived clients
++		  can call this method to allow the realmd service to quit.
++		  This is an optimization. The daemon will not exit immediately.
++		  It is safe to call this multiple times.
++		-->
++		<method name="Release">
++			<!-- no arguments -->
++		</method>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.Realm:
++	  @short_description: a realm
++
++	  Represents one realm.
++
++	  Contains generic information about a realm, and useful properties for
++	  introspecting what kind of realm this is and how to work with
++	  the realm.
++
++	  Use #org.freedesktop.realmd.Provider:Realms or
++	  #org.freedesktop.realmd.Provider.Discover() to get access to some
++	  kerberos realm objects.
++
++	  Realms will always implement additional interfaces, such as
++	  #org.freedesktop.realmd.Kerberos.  Do not assume that all realms
++	  implement that kerberos interface. Use the
++	  #org.freedesktop.realmd.Realm:SupportedInterfaces property to see
++	  which interfaces are supported.
++
++	  Different realms support various ways to configure them on the
++	  system. Use the #org.freedesktop.realmd.Realm:Configured property
++	  to determine if a realm is configured. If it is configured, the
++	  property will be set to the interface of the mechanism that was
++	  used to configure it.
++
++	  To configure a realm, look in the
++	  #org.freedesktop.realmd.Realm:SupportedInterfaces property for a
++	  recognized purpose-specific interface that can be used for
++	  configuration, such as the
++	  #org.freedesktop.realmd.KerberosMembership interface and its
++	  #org.freedesktop.realmd.KerberosMembership.Join() method.
++
++	  To deconfigure a realm from the current system, you can use the
++	  #org.freedesktop.realmd.Realm.Deconfigure() method. In addition, some
++	  of the configuration specific interfaces provide methods to
++	  deconfigure a realm in a specific way, such as the
++	  #org.freedesktop.realmd.KerberosMembership.Leave() method.
++
++	  The various properties are guaranteed to have been updated before
++	  the operation methods return, if they change state.
++	-->
++	<interface name="org.freedesktop.realmd.Realm">
++
++		<!--
++		  Name: the realm name
++
++		  This is the name of the realm, appropriate for display to
++		  end users where necessary.
++		-->
++		<property name="Name" type="s" access="read"/>
++
++		<!--
++		  Configured: whether this domain is configured and how
++
++		  If this property is an empty string, then the realm is not
++		  configured. Otherwise the realm is configured, and contains
++		  a string which is the interface that represents how it was
++		  configured, for example #org.freedesktop.realmd.KerberosMembership.
++		-->
++		<property name="Configured" type="s" access="read"/>
++
++		<!--
++		  Deconfigure: deconfigure this realm
++
++		  Deconfigure this realm from the local machine with standard
++		  default behavior.
++
++		  The behavior of this method depends on the which configuration
++		  interface is present in the
++		  #org.freedesktop.realmd.Realm.Configured property. It does not
++		  always delete membership accounts in the realm, but just
++		  reconfigures the local machine so it no longer is configured
++		  for the given realm. In some cases the implementation may try
++		  to update membership accounts, but this is not guaranteed.
++
++		  Various configuration interfaces may support more specific ways
++		  to deconfigure a realm in a specific way, such as the
++		  #org.freedesktop.realmd.KerberosMembership.Leave() method.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.deconfigure-realm</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the deconfigure failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to deconfigure a
++		      realm.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotConfigured</literal>:
++		      returned if this realm is not configured on the machine.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Deconfigure">
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++		<!--
++		  SupportedInterfaces:
++
++		  Additional supported interfaces of this realm. This includes
++		  interfaces that contain more information about the realm,
++		  such as #org.freedesktop.realmd.Kerberos and interfaces
++		  which contain methods for configuring a realm, such as
++		  #org.freedesktop.realmd.KerberosMembership.
++		-->
++		<property name="SupportedInterfaces" type="as" access="read"/>
++
++		<!--
++		  Details: informational details about the realm
++
++		  Informational details about the realm. The following values
++		  should be present:
++		  <itemizedlist>
++		    <listitem><para><literal>server-software</literal>:
++		      identifier of the software running on the server (e.g.
++		      <literal>active-directory</literal>).</para></listitem>
++		    <listitem><para><literal>client-software</literal>:
++		      identifier of the software running on the client (e.g.
++		      <literal>sssd</literal>).</para></listitem>
++		  </itemizedlist>
++		-->
++		<property name="Details" type="a(ss)" access="read"/>
++
++		<!--
++		  RequiredPackages: prerequisite software
++
++		  Software packages that are required in order for a join to
++		  succeed. These are either simple strings like <literal>sssd</literal>,
++		  or strings with an operator and version number like
++		  <literal>sssd >= 1.9.0</literal>
++
++		  These values are specific to the packaging system that is
++		  being run.
++		-->
++		<property name="RequiredPackages" type="as" access="read"/>
++
++		<!--
++		  LoginFormats: supported formats for login names
++
++		  Supported formats for login to this realm. This is only
++		  relevant once the realm has been enrolled. The formats
++		  will contain a <literal>%U</literal> in the string, which
++		  indicate where the user name should be placed. The formats
++		  may contain a <literal>%D</literal> in the string which
++		  indicate where a domain name should be placed.
++
++		  The first format in the list is the preferred format for
++		  login names.
++		-->
++		<property name="LoginFormats" type="as" access="read"/>
++
++		<!--
++		  LoginPolicy: the policy for logins using this realm
++
++		  The policy for logging into this computer using this realm.
++
++		  The policy can be changed using the
++		  #org.freedesktop.realmd.Realm.ChangeLoginPolicy() method.
++
++		  The following policies are predefined. Not all providers
++		  support all these policies and there may be provider specific
++		  policies or multiple policies represented in the string:
++		  <itemizedlist>
++		    <listitem><para><literal>allow-any-login</literal>: allow
++		      login by any authenticated user present in this
++		      realm.</para></listitem>
++		    <listitem><para><literal>allow-realm-logins</literal>: allow
++		      logins according to the realm or domain policy for logins
++		      on this machine. This usually defaults to allowing any realm
++		      user to log in.</para></listitem>
++		    <listitem><para><literal>allow-permitted-logins</literal>:
++		      only allow the logins permitted in the
++		      #org.freedesktop.realmd.Realm:PermittedLogins
++		      property.</para></listitem>
++		    <listitem><para><literal>deny-any-login</literal>:
++		      don't allow any logins via authenticated users of this
++		      realm.</para></listitem>
++		  </itemizedlist>
++		-->
++		<property name="LoginPolicy" type="s" access="read"/>
++
++		<!--
++		  PermittedLogins: the permitted login names
++
++		  The list of permitted authenticated users allowed to login
++		  into this computer. This is only relevant if the
++		  #org.freedesktop.realmd.Realm:LoginPolicy property
++		  contains the <literal>allow-permitted-logins</literal>
++		  string.
++		-->
++		<property name="PermittedLogins" type="as" access="read"/>
++
++		<!--
++		  PermittedGroups: the permitted group names
++
++		  The list of groups which users need to be in to be allowed
++		  to log into this computer. This is only relevant if the
++		  #org.freedesktop.realmd.Realm:LoginPolicy property
++		  contains the <literal>allow-permitted-logins</literal>
++		  string.
++		-->
++		<property name="PermittedGroups" type="as" access="read"/>
++
++		<!--
++		  ChangeLoginPolicy:
++		  @login_policy: the new login policy, or an empty string
++		  @permitted_add: a list of logins to permit
++		  @permitted_remove: a list of logins to not permit
++		  @options: options for this operation
++
++		  Change the login policy and/or permitted logins for this realm.
++
++		  Not all realms support all the various login policies. An
++		  error will be returned if the new login policy is not supported.
++		  You may specify an empty string for the @login_policy argument
++		  which will cause no change in the policy itself. If the policy
++		  is changed, it will be reflected in the
++		  #org.freedesktop.realmd.Realm:LoginPolicy property.
++
++		  The @permitted_add and @permitted_remove arguments represent
++		  lists of login names that should be added and removed from
++		  the #org.freedesktop.realmd.Kerberos:PermittedLogins property.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		    <listitem><para><literal>groups</literal>: boolean which if
++		    set to <literal>TRUE</literal> means that the names in
++		    @permitted_add and @permitted_remove are group names instead
++		    of login names.</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.login-policy</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the policy change failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to change login policy
++		      operation.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotConfigured</literal>:
++		      returned if the realm is not configured.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="ChangeLoginPolicy">
++			<arg name="login_policy" type="s" direction="in"/>
++			<arg name="permitted_add" type="as" direction="in"/>
++			<arg name="permitted_remove" type="as" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.Kerberos:
++	  @short_description: a kerberos realm
++
++	  An interface that describes a kerberos realm in more detail. This
++	  is always implemented on an DBus object path that also implements
++	  the #org.freedesktop.realmd.Realm interface.
++	-->
++	<interface name="org.freedesktop.realmd.Kerberos">
++
++		<!--
++		  RealmName: the kerberos realm name
++
++		  The kerberos name for this realm. This is usually in upper
++		  case.
++		-->
++		<property name="RealmName" type="s" access="read"/>
++
++		<!--
++		  DomainName: the DNS domain name
++
++		  The DNS domain name for this realm.
++		-->
++		<property name="DomainName" type="s" access="read"/>
++
++	</interface>
++
++	<!--
++	  org.freedesktop.realmd.KerberosMembership:
++
++	  An interface used to configure this machine by joining a realm.
++
++	  It sets up a computer/host account in the realm for this machine
++	  and a keytab to track the credentials for that account.
++
++	  The various properties are guaranteed to have been updated before
++	  the operation methods return, if they change state.
++	-->
++	<interface name="org.freedesktop.realmd.KerberosMembership">
++
++		<!--
++		  SuggestedAdministrator: common administrator name
++
++		  The common administrator name for this type of realm. This
++		  can be used by clients as a hint when prompting the user for
++		  administrative authentication.
++		-->
++		<property name="SuggestedAdministrator" type="s" access="read"/>
++
++		<!--
++		  SupportedJoinCredentials: credentials supported for joining
++
++		  Various kinds of credentials that are supported when calling the
++		  #org.freedesktop.realmd.Kerberos.Join() method.
++
++		  Each credential is represented by a type and an owner. The type
++		  denotes which kind of credential is passed to the method. The
++		  owner indicates to the client how to prompt the user or obtain
++		  the credential, and to the service how to use the credential.
++
++		  The various types are:
++		  <itemizedlist>
++		    <listitem><para><literal>ccache</literal>:
++		      the credentials should contain an array of bytes as a
++		      <literal>ay</literal> containing the data from a kerberos
++		      credential cache file.</para></listitem>
++		    <listitem><para><literal>password</literal>:
++		      the credentials should contain a pair of strings as a
++		      <literal>(ss)</literal> representing a name and
++		      password. The name may contain a realm in the standard
++		      kerberos format. If a realm is missing, it will default
++		      to this realm. </para></listitem>
++		    <listitem><para><literal>secret</literal>:
++		      the credentials should contain a string secret as an
++		      <literal>ay</literal> array of bytes. This is usually used
++		      for one time passwords. To pass a string here, encode it
++		      in UTF-8, and place the resulting bytes in the
++		      value.</para></listitem>
++		    <listitem><para><literal>automatic</literal>:
++		      the credentials should contain an empty string as a
++		      <literal>s</literal>. Using <literal>automatic</literal>
++		      indicates that default or system credentials are to be
++		      used.</para></listitem>
++		  </itemizedlist>
++
++		  The various owners are:
++		  <itemizedlist>
++		    <listitem><para><literal>administrator</literal>:
++		      the credentials belong to a kerberos administrator principal.
++		      The caller may use this as a hint to prompt the user
++		      for administrative credentials.</para></listitem>
++		    <listitem><para><literal>user</literal>:
++		      the credentials belong to a kerberos user principal.
++		      The caller may use this as a hint to prompt the user
++		      for his (possibly non-administrative)
++		      credentials.</para></listitem>
++		    <listitem><para><literal>computer</literal>:
++		      the credentials belong to a computer account.</para></listitem>
++		    <listitem><para><literal>none</literal>:
++		      the credentials have an unspecified owner, such as a one
++		      time password.</para></listitem>
++		  </itemizedlist>
++		-->
++		<property name="SupportedJoinCredentials" type="a(ss)" access="read"/>
++
++		<!--
++		  SupportedLeaveCredentials: credentials supported for leaving
++
++		  Various kinds of credentials that are supported when calling the
++		  #org.freedesktop.realmd.Kerberos.Leave() method.
++
++		  See #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials for
++		  a discussion of what the values represent.
++		-->
++		<property name="SupportedLeaveCredentials" type="a(ss)" access="read"/>
++
++		<!--
++		  Join:
++
++		  Join this machine to the realm and enroll the machine.
++
++		  If this method returns successfully, then the machine will be
++		  joined to the realm. It is not necessary to restart services or the
++		  machine afterward. Relevant properties on the realm will be updated
++		  before the method returns.
++
++		  The @credentials should be set according to one of the
++		  supported credentials returned by
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials.
++		  The first string in the tuple is the type, the second string
++		  is the owner, and the variant contains the credential contents
++		  See the discussion at
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials
++		  for more information.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++                    <listitem><para><literal>automatic-id-mapping</literal>: a boolean
++                      value whether to turn on automatic UID/GID mapping. If not
++		      specified the default will come from realmd.conf
++                      configuration.</para></listitem>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		    <listitem><para><literal>computer-ou</literal>: a string
++		      containing an LDAP DN for an organizational unit where the
++		      computer account should be created</para></listitem>
++		    <listitem><para><literal>user-principal</literal>: a string
++		      containing an kerberos user principal name to be set on the
++		      computer account</para></listitem>
++		    <listitem><para><literal>membership-software</literal>: a string
++		      containing the membership software identifier that the returned
++		      realms should match.</para></listitem>
++		    <listitem><para><literal>manage-system</literal>: a boolean
++		      which controls whether this machine should be managed by
++		      the realm or domain or not. Defaults to true.</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.configure-realm</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the join failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to perform a join
++		      operation.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.AuthenticationFailed</literal>:
++		      returned if the credentials passed did not authenticate against the realm
++		      correctly. It is appropriate to prompt the user again.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.AlreadyEnrolled</literal>:
++		      returned if already enrolled in this realm, or if already enrolled in another realm
++		      (if enrolling in multiple realms is not supported).</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.BadHostname</literal>:
++		      returned if the machine has a hostname that is not usable for a join
++		      or is in conflict with those in the domain.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Join">
++			<arg name="credentials" type="(ssv)" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++		<!--
++		  Leave:
++
++		  Leave the realm and unenroll the machine.
++
++		  If this method returns successfully, then the machine will have
++		  left the domain and been unenrolled. It is not necessary to restart
++		  services or the machine afterward. Relevant properties on the realm
++		  will be updated before the method returns.
++
++		  The @credentials should be set according to one of the
++		  supported credentials returned by
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials.
++		  The first string in the tuple is the type, the second string
++		  is the owner, and the variant contains the credential contents
++		  See the discussion at
++		  #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials
++		  for more information.
++
++		  @options can contain, but is not limited to, the following values:
++		  <itemizedlist>
++		    <listitem><para><literal>operation</literal>: a string
++		      identifier chosen by the client, which can then later be
++		      passed to org.freedesktop.realmd.Service.Cancel() in order
++		      to cancel the operation</para></listitem>
++		  </itemizedlist>
++
++		  This method requires authorization for the PolicyKit action
++		  called <literal>org.freedesktop.realmd.deconfigure-realm</literal>.
++
++		  In addition to common DBus error results, this method may return:
++		  <itemizedlist>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
++		      may be returned if the unenroll failed for a generic reason.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
++		      returned if the operation was cancelled.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
++		      returned if the calling client is not permitted to perform an unenroll
++		      operation.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.AuthenticationFailed</literal>:
++		      returned if the credentials passed did not authenticate against the realm
++		      correctly. It is appropriate to prompt the user again.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.NotEnrolled</literal>:
++		      returned if not enrolled in this realm.</para></listitem>
++		    <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
++		      returned if the service is currently performing another operation like
++		      join or leave.</para></listitem>
++		  </itemizedlist>
++		-->
++		<method name="Leave">
++			<arg name="credentials" type="(ssv)" direction="in"/>
++			<arg name="options" type="a{sv}" direction="in"/>
++		</method>
++
++	</interface>
++
++</node>
+-- 
+2.21.0
+
diff --git a/SOURCES/0001-lib-save-os-when-creating-user.patch b/SOURCES/0001-lib-save-os-when-creating-user.patch
index 6d1116379757aad2f60d4e044adb83081e6f19db..6439f3ed01c838db38c5aba99d6be1d687853ccc 100644
--- a/SOURCES/0001-lib-save-os-when-creating-user.patch
+++ b/SOURCES/0001-lib-save-os-when-creating-user.patch
@@ -1,4 +1,4 @@
-From 4ff9bc526fec4be51f42739b4258529d7e4695a1 Mon Sep 17 00:00:00 2001
+From 51d5c9e9baec33aa74a60a4ac11f1de8f71acb2a Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Fri, 12 Oct 2018 15:53:52 -0400
 Subject: [PATCH] lib: save os when creating user
@@ -17,10 +17,10 @@ extension to accountsservice.
  create mode 100644 data/com.redhat.AccountsServiceUser.System.xml
 
 diff --git a/data/Makefile.am b/data/Makefile.am
-index 521c6c2..a441452 100644
+index 6cf5e30..648774c 100644
 --- a/data/Makefile.am
 +++ b/data/Makefile.am
-@@ -1,44 +1,56 @@
+@@ -1,45 +1,57 @@
  
  dbusifdir   = $(datadir)/dbus-1/interfaces
  dbusif_DATA = \
@@ -61,6 +61,7 @@ index 521c6c2..a441452 100644
  	$(dbusconf_DATA)	\
  	$(service_in_files)	\
  	$(policy_in_files)      \
+ 	org.freedesktop.realmd.xml	\
  	accounts-daemon.service.in
  
  DISTCLEANFILES = 		\
@@ -180,7 +181,7 @@ index 408d91f..d711d65 100644
  
  libaccountsservice_la_sources =                                               \
 diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
-index 325421b..091b46a 100644
+index e7e26b1..9f3d6e5 100644
 --- a/src/libaccountsservice/act-user-manager.c
 +++ b/src/libaccountsservice/act-user-manager.c
 @@ -27,60 +27,61 @@
@@ -840,5 +841,5 @@ index 325421b..091b46a 100644
  {
          GError *local_error = NULL;
 -- 
-2.17.1
+2.21.0
 
diff --git a/SPECS/accountsservice.spec b/SPECS/accountsservice.spec
index fcbb382fa77b9f22686b0e7630a71a2cc347fd52..380e9f6ada08f10e39218b6cfbae5486e6eb8663 100644
--- a/SPECS/accountsservice.spec
+++ b/SPECS/accountsservice.spec
@@ -2,7 +2,7 @@
 
 Name:           accountsservice
 Version:        0.6.50
-Release:        7%{?dist}
+Release:        8%{?dist}
 Summary:        D-Bus interfaces for querying and manipulating user account information
 License:        GPLv3+
 URL:            https://www.freedesktop.org/wiki/Software/AccountsService/
@@ -28,6 +28,8 @@ Patch20:        0001-lib-don-t-set-loaded-state-until-seat-is-fetched.patch
 
 Patch30:        0001-data-don-t-send-change-updates-for-login-history.patch
 
+Patch40:        0001-daemon-if-no-local-users-check-if-machine-is-enrolle.patch
+
 Patch90:        0001-lib-save-os-when-creating-user.patch
 
 Requires:       polkit
@@ -113,6 +115,10 @@ rm $RPM_BUILD_ROOT%{_libdir}/*.a
 %{_datadir}/gtk-doc/html/libaccountsservice/*
 
 %changelog
+* Sun Dec 15 2019 Ray Strode <rstrode@redhat.com> - 0.6.50-8
+- Don't set HasNoUsers=true if realmd has providers
+  Related: #1750516
+
 * Mon Jun 17 2019 Ray Strode <rstrode@redhat.com> - 0.6.50-7
 - Don't send change updates for login history changes
   Resolves: #1713080