diff --git a/src/gconf-helpers/gconf-helpers.c b/src/gconf-helpers/gconf-helpers.c
index a299ccc..e7dc5f6 100644
--- a/src/gconf-helpers/gconf-helpers.c
+++ b/src/gconf-helpers/gconf-helpers.c
@@ -1576,6 +1576,52 @@ typedef struct ReadFromGConfInfo {
 
 #define FILE_TAG "file://"
 
+/* Normalizes byte order of elements in array of ints by means of htonl() function:
+ *   big endian machine    - no swapping
+ *   little endian machine - byte order is changed host <-> network 
+ * Used for DNS IP addresses.
+ */
+static void
+normalize_byte_order_dns (GArray *array)
+{
+	int i;
+	guint32 *item;
+
+	if (array == NULL) return;
+
+	for (i = 0; i < array->len; i++) {
+		item = &g_array_index (array, guint32, i);  /* get the value */
+		*item = htonl (*item);                      /* change byte order */
+	}
+}
+
+/* Normalizes byte order of address elements in array of ints by means of htonl() function:
+ *   big endian machine    - no swapping
+ *   little endian machine - byte order is changed host <-> network 
+ * Used for IPs in addresses and routes.
+ * IP addresses are at index 0 and 2 for both addresses and routes tuples.
+ */
+static void
+normalize_byte_order_addresses_routes (GPtrArray *array)
+{
+	int i, j;
+	guint32 *item;
+
+	if (array == NULL) return;
+
+	for (i = 0; i < array->len; i++) {
+			GArray *tuple = g_ptr_array_index (array, i);
+
+			for (j = 0; j < tuple->len; j++)  {
+				if (j == 0 || j == 2) {                   /* just for addresses */
+				item = &g_array_index (tuple, guint32, j);   /* get the value */
+				*item = htonl (*item);                       /* change byte order */
+			}
+		}
+	}
+}
+
+
 static void
 read_one_setting_value_from_gconf (NMSetting *setting,
                                    const char *key,
@@ -1719,6 +1765,14 @@ read_one_setting_value_from_gconf (NMSetting *setting,
 		GArray *a_val = NULL;
 
 		if (nm_gconf_get_uint_array_helper (info->client, info->dir, key, setting_name, &a_val)) {
+			/* Change endianness: 
+			 * DNS IPv4 address is stored in GConf as integer. NM stores it also as interger (guint32),
+			 * but interprets it as IP address in network-byte order. In order to have common values,
+			 * both for little endian and big endian machines, we need to normalize byte order 
+			 * (the actual change is swapping byte order on little endian machine).
+			 */
+			if (!strcmp (key, NM_SETTING_IP4_CONFIG_DNS))
+				normalize_byte_order_dns (a_val);
 			g_object_set (setting, key, a_val, NULL);
 			g_array_free (a_val, TRUE);
 		}
@@ -1732,6 +1786,9 @@ read_one_setting_value_from_gconf (NMSetting *setting,
 			tuple_len = 4;
 
 		if (nm_gconf_get_ip4_helper (info->client, info->dir, key, setting_name, tuple_len, &pa_val)) {
+			/* Change endianness - see comment above */
+			if (!strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES) || !strcmp (key, NM_SETTING_IP4_CONFIG_ROUTES))
+				normalize_byte_order_addresses_routes (pa_val);
 			g_object_set (setting, key, pa_val, NULL);
 			g_ptr_array_foreach (pa_val, (GFunc) free_one_addr, NULL);
 			g_ptr_array_free (pa_val, TRUE);
@@ -2411,20 +2468,58 @@ copy_one_setting_value_to_gconf (NMSetting *setting,
 		                                setting_name,
 		                                (GHashTable *) g_value_get_boxed (value));
 	} else if (type == DBUS_TYPE_G_UINT_ARRAY) {
+		GArray *array, *temp_array = NULL;
+
+ 		array = (GArray *) g_value_get_boxed (value);
+		if (array) {
+			/* create temporary array */
+ 			temp_array = g_array_sized_new (FALSE, TRUE, g_array_get_element_size (array), array->len);
+	 		g_array_insert_vals (temp_array, 0, array->data, array->len);
+
+			/* Change endianness - see comment in read_one_setting_value_from_gconf() */
+			if (!strcmp (key, NM_SETTING_IP4_CONFIG_DNS))
+				normalize_byte_order_dns (temp_array);
+		}
+
 		nm_gconf_set_uint_array_helper (info->client, info->dir,
 								  key, setting_name,
-								  (GArray *) g_value_get_boxed (value));
+								  temp_array);
+		if (temp_array)
+			g_array_free (temp_array, TRUE);
 	} else if (type == DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT) {
 		guint32 tuple_len = 0;
+		GPtrArray *array, *temp_array = NULL;
+		GArray *item, *item_new;
+		int i;
 
 		if (!strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES))
 			tuple_len = 3;
 		else if (!strcmp (key, NM_SETTING_IP4_CONFIG_ROUTES))
 			tuple_len = 4;
 
+ 		array = (GPtrArray *) g_value_get_boxed (value);
+		if (array) {
+			/* create temporary array */
+ 			temp_array = g_ptr_array_sized_new (array->len);
+			for (i = 0; i < array->len; i++) {
+				item = g_ptr_array_index (array, i);
+				item_new = g_array_sized_new (FALSE, TRUE, g_array_get_element_size (item), item->len);
+	 			g_array_insert_vals (item_new, 0, item->data, item->len);
+				g_ptr_array_add (temp_array, item_new);
+			}
+
+			/* Change endianness - see comment in read_one_setting_value_from_gconf() */
+			if (!strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES) || !strcmp (key, NM_SETTING_IP4_CONFIG_ROUTES))
+				normalize_byte_order_addresses_routes (temp_array);
+		}
+
 		nm_gconf_set_ip4_helper (info->client, info->dir,
 								  key, setting_name, tuple_len,
-								  (GPtrArray *) g_value_get_boxed (value));
+								  temp_array);
+		if (temp_array) {
+			g_ptr_array_foreach (temp_array, (GFunc) free_one_addr, NULL);
+			g_ptr_array_free (temp_array, TRUE);
+		}
 	} else if (type == DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR) {
 		nm_gconf_set_ip6dns_array_helper (info->client, info->dir,
 										  key, setting_name,
