diff --git a/SOURCES/0001-adutil-add-_adcli_strv_add_unique.patch b/SOURCES/0001-adutil-add-_adcli_strv_add_unique.patch
new file mode 100644
index 0000000..f49f5f8
--- /dev/null
+++ b/SOURCES/0001-adutil-add-_adcli_strv_add_unique.patch
@@ -0,0 +1,134 @@
+From 85d127fd52a8469f9f3ce0d1130fe17e756fdd75 Mon Sep 17 00:00:00 2001
+From: Sumit Bose <sbose@redhat.com>
+Date: Fri, 16 Nov 2018 13:32:33 +0100
+Subject: [PATCH 1/2] adutil: add _adcli_strv_add_unique
+
+_adcli_strv_add_unique checks is the new value already exists in the
+strv before adding it. Check can be done case-sensitive or not.
+
+Related to https://gitlab.freedesktop.org/realmd/adcli/issues/16
+---
+ library/adprivate.h |  5 ++++
+ library/adutil.c    | 65 ++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 61 insertions(+), 9 deletions(-)
+
+diff --git a/library/adprivate.h b/library/adprivate.h
+index bc9df6d..0806430 100644
+--- a/library/adprivate.h
++++ b/library/adprivate.h
+@@ -111,6 +111,11 @@ char **        _adcli_strv_add               (char **strv,
+                                               char *string,
+                                               int *length) GNUC_WARN_UNUSED;
+ 
++char **        _adcli_strv_add_unique        (char **strv,
++                                              char *string,
++                                              int *length,
++                                              bool case_sensitive) GNUC_WARN_UNUSED;
++
+ void           _adcli_strv_remove_unsorted   (char **strv,
+                                               const char *string,
+                                               int *length);
+diff --git a/library/adutil.c b/library/adutil.c
+index 17d2caa..76ea158 100644
+--- a/library/adutil.c
++++ b/library/adutil.c
+@@ -221,6 +221,34 @@ _adcli_strv_add (char **strv,
+ 	return seq_push (strv, length, string);
+ }
+ 
++static int
++_adcli_strv_has_ex (char **strv,
++                    const char *str,
++                    int (* compare) (const char *match, const char*value))
++{
++	int i;
++
++	for (i = 0; strv && strv[i] != NULL; i++) {
++		if (compare (strv[i], str) == 0)
++			return 1;
++	}
++
++	return 0;
++}
++
++char **
++_adcli_strv_add_unique (char **strv,
++                        char *string,
++                        int *length,
++                        bool case_sensitive)
++{
++	if (_adcli_strv_has_ex (strv, string, case_sensitive ? strcmp : strcasecmp) == 1) {
++		return strv;
++	}
++
++	return _adcli_strv_add (strv, string, length);
++}
++
+ #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
+ 
+ void
+@@ -241,19 +269,11 @@ _adcli_strv_remove_unsorted (char **strv,
+ 	                            (seq_compar)strcasecmp, free);
+ }
+ 
+-
+ int
+ _adcli_strv_has (char **strv,
+                  const char *str)
+ {
+-	int i;
+-
+-	for (i = 0; strv && strv[i] != NULL; i++) {
+-		if (strcmp (strv[i], str) == 0)
+-			return 1;
+-	}
+-
+-	return 0;
++	return _adcli_strv_has_ex (strv, str, strcmp);
+ }
+ 
+ void
+@@ -704,6 +724,32 @@ test_strv_add_free (void)
+ 	_adcli_strv_free (strv);
+ }
+ 
++static void
++test_strv_add_unique_free (void)
++{
++	char **strv = NULL;
++
++	strv = _adcli_strv_add_unique (strv, strdup ("one"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("one"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("two"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("two"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("tWo"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("three"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("three"), NULL, false);
++	strv = _adcli_strv_add_unique (strv, strdup ("TWO"), NULL, true);
++
++	assert_num_eq (_adcli_strv_len (strv), 4);
++
++	assert_str_eq (strv[0], "one");
++	assert_str_eq (strv[1], "two");
++	assert_str_eq (strv[2], "three");
++	assert_str_eq (strv[3], "TWO");
++	assert (strv[4] == NULL);
++
++	_adcli_strv_free (strv);
++}
++
++
+ static void
+ test_strv_dup (void)
+ {
+@@ -856,6 +902,7 @@ main (int argc,
+       char *argv[])
+ {
+ 	test_func (test_strv_add_free, "/util/strv_add_free");
++	test_func (test_strv_add_unique_free, "/util/strv_add_unique_free");
+ 	test_func (test_strv_dup, "/util/strv_dup");
+ 	test_func (test_strv_count, "/util/strv_count");
+ 	test_func (test_check_nt_time_string_lifetime, "/util/check_nt_time_string_lifetime");
+-- 
+2.20.1
+
diff --git a/SOURCES/0002-adenroll-use-_adcli_strv_add_unique-for-service-prin.patch b/SOURCES/0002-adenroll-use-_adcli_strv_add_unique-for-service-prin.patch
new file mode 100644
index 0000000..e4a6bc5
--- /dev/null
+++ b/SOURCES/0002-adenroll-use-_adcli_strv_add_unique-for-service-prin.patch
@@ -0,0 +1,83 @@
+From 0c027538f398b3823bedbfbf5f388ad97784a0ec Mon Sep 17 00:00:00 2001
+From: Sumit Bose <sbose@redhat.com>
+Date: Fri, 16 Nov 2018 13:32:59 +0100
+Subject: [PATCH 2/2] adenroll: use _adcli_strv_add_unique for service
+ principals
+
+Check if service principals is already in the list before adding it.
+
+Related to https://gitlab.freedesktop.org/realmd/adcli/issues/16
+---
+ library/adenroll.c | 31 ++++++++-----------------------
+ 1 file changed, 8 insertions(+), 23 deletions(-)
+
+diff --git a/library/adenroll.c b/library/adenroll.c
+index de2242a..e02f403 100644
+--- a/library/adenroll.c
++++ b/library/adenroll.c
+@@ -313,7 +313,6 @@ add_service_names_to_service_principals (adcli_enroll *enroll)
+ 	char *name;
+ 	int length = 0;
+ 	int i;
+-	size_t c;
+ 
+ 	if (enroll->service_principals != NULL) {
+ 		length = seq_count (enroll->service_principals);
+@@ -322,28 +321,14 @@ add_service_names_to_service_principals (adcli_enroll *enroll)
+ 	for (i = 0; enroll->service_names[i] != NULL; i++) {
+ 		if (asprintf (&name, "%s/%s", enroll->service_names[i], enroll->computer_name) < 0)
+ 			return_unexpected_if_reached ();
+-		for (c = 0; enroll->service_principals != NULL && enroll->service_principals[c] != NULL; c++) {
+-			if (strcmp (name, enroll->service_principals[c]) == 0) {
+-				break;
+-			}
+-		}
+-		if (enroll->service_principals == NULL || enroll->service_principals[c] == NULL) {
+-			enroll->service_principals = _adcli_strv_add (enroll->service_principals,
+-				                                      name, &length);
+-		}
++		enroll->service_principals = _adcli_strv_add_unique (enroll->service_principals,
++		                                                     name, &length, false);
+ 
+ 		if (enroll->host_fqdn) {
+ 			if (asprintf (&name, "%s/%s", enroll->service_names[i], enroll->host_fqdn) < 0)
+ 				return_unexpected_if_reached ();
+-			for (c = 0; enroll->service_principals != NULL && enroll->service_principals[c] != NULL; c++) {
+-				if (strcmp (name, enroll->service_principals[c]) == 0) {
+-					break;
+-				}
+-			}
+-			if (enroll->service_principals == NULL || enroll->service_principals[c] == NULL) {
+-				enroll->service_principals = _adcli_strv_add (enroll->service_principals,
+-					                                      name, &length);
+-			}
++			enroll->service_principals = _adcli_strv_add_unique (enroll->service_principals,
++			                                                     name, &length, false);
+ 		}
+ 	}
+ 
+@@ -364,9 +349,9 @@ add_and_remove_service_principals (adcli_enroll *enroll)
+ 	list = adcli_enroll_get_service_principals_to_add (enroll);
+ 	if (list != NULL) {
+ 		for (c = 0; list[c] != NULL; c++) {
+-			enroll->service_principals = _adcli_strv_add (enroll->service_principals,
+-			                                              strdup (list[c]),
+-			                                              &length);
++			enroll->service_principals = _adcli_strv_add_unique (enroll->service_principals,
++			                                                     strdup (list[c]),
++			                                                     &length, false);
+ 			if (enroll->service_principals == NULL) {
+ 				return ADCLI_ERR_UNEXPECTED;
+ 			}
+@@ -1525,7 +1510,7 @@ load_keytab_entry (krb5_context k5,
+ 			value = strdup (name);
+ 			return_val_if_fail (value != NULL, FALSE);
+ 			_adcli_info ("Found service principal in keytab: %s", value);
+-			enroll->service_principals = _adcli_strv_add (enroll->service_principals, value, NULL);
++			enroll->service_principals = _adcli_strv_add_unique (enroll->service_principals, value, NULL, false);
+ 		}
+ 	}
+ 
+-- 
+2.20.1
+
diff --git a/SPECS/adcli.spec b/SPECS/adcli.spec
index 138c688..7d864df 100644
--- a/SPECS/adcli.spec
+++ b/SPECS/adcli.spec
@@ -1,6 +1,6 @@
 Name:		adcli
 Version:	0.8.1
-Release:	6%{?dist}
+Release:	6%{?dist}.1
 Summary:	Active Directory enrollment
 License:	LGPLv2+
 URL:		http://cgit.freedesktop.org/realmd/adcli
@@ -46,6 +46,10 @@ Patch31:        0003-Do-not-add-service-principals-twice.patch
 # Additional fixed for rhbz#1547014
 Patch32:        0004-Do-not-depend-on-default_realm-in-krb5.conf.patch
 
+# rhbz#1666775
+Patch33:        0001-adutil-add-_adcli_strv_add_unique.patch
+Patch34:        0002-adenroll-use-_adcli_strv_add_unique-for-service-prin.patch
+
 BuildRequires:	intltool pkgconfig
 BuildRequires:	libtool
 BuildRequires:	gettext-devel
@@ -100,6 +104,8 @@ standard LDAP and Kerberos calls.
 %patch30 -p1
 %patch31 -p1
 %patch32 -p1
+%patch33 -p1
+%patch34 -p1
 
 %build
 autoreconf --force --install --verbose
@@ -126,6 +132,9 @@ find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
 %doc %{_mandir}/*/*
 
 %changelog
+* Wed Jan 16 2019 Sumit Bose <sbose@redhat.com> - 0.8.1-6.1
+- join failed if hostname is not FQDN [#1666775]
+
 * Tue Aug 14 2018 Sumit Bose <sbose@redhat.com> - 0.8.1-6
 - Couldn't set service principals on computer account [#1608212]
 - additional fix #1547014 and #1593240