diff --git a/ares/ares.h b/ares/ares.h
index e2c7f4c0511873176bdd92c0b2701a72faaf040e..0f162e2a126ee013b0ab8a7b2c6280c3010aa47f 100644
--- a/ares/ares.h
+++ b/ares/ares.h
@@ -185,7 +185,6 @@ struct ares_options {
   int timeout; /* in seconds or milliseconds, depending on options */
   int tries;
   int ndots;
-  int rotate;
   unsigned short udp_port;
   unsigned short tcp_port;
   int socket_send_buffer_size;
diff --git a/ares/ares_init.c b/ares/ares_init.c
index 7c355c39eeef86c4f1cc1d365d9f9fc5d9685443..55c0b93ab192a869636313fe672239da6e1457bb 100644
--- a/ares/ares_init.c
+++ b/ares/ares_init.c
@@ -269,10 +269,14 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
   if (!ARES_CONFIG_CHECK(channel))
     return ARES_ENODATA;
 
+  /* Traditionally the optmask wasn't saved in the channel struct so it was
+     recreated here. ROTATE is the first option that has no struct field of
+     its own in the public config struct */
   (*optmask) = (ARES_OPT_FLAGS|ARES_OPT_TRIES|ARES_OPT_NDOTS|
                 ARES_OPT_UDP_PORT|ARES_OPT_TCP_PORT|ARES_OPT_SOCK_STATE_CB|
                 ARES_OPT_SERVERS|ARES_OPT_DOMAINS|ARES_OPT_LOOKUPS|
-                ARES_OPT_SORTLIST|ARES_OPT_TIMEOUTMS);
+                ARES_OPT_SORTLIST|ARES_OPT_TIMEOUTMS) |
+    (channel->optmask & ARES_OPT_ROTATE);
 
   /* Copy easy stuff */
   options->flags   = channel->flags;
@@ -355,7 +359,7 @@ static int init_by_options(ares_channel channel,
   if ((optmask & ARES_OPT_NDOTS) && channel->ndots == -1)
     channel->ndots = options->ndots;
   if ((optmask & ARES_OPT_ROTATE) && channel->rotate == -1)
-    channel->rotate = options->rotate;
+    channel->rotate = 1;
   if ((optmask & ARES_OPT_UDP_PORT) && channel->udp_port == -1)
     channel->udp_port = options->udp_port;
   if ((optmask & ARES_OPT_TCP_PORT) && channel->tcp_port == -1)
@@ -431,6 +435,8 @@ static int init_by_options(ares_channel channel,
       channel->nsort = options->nsort;
     }
 
+  channel->optmask = optmask;
+
   return ARES_SUCCESS;
 }
 
diff --git a/ares/ares_private.h b/ares/ares_private.h
index a7be3f0eaf425906958a6cb38fcd9f767604c89d..bae0b077d46865b1d2d2cf5de93017981611f2b9 100644
--- a/ares/ares_private.h
+++ b/ares/ares_private.h
@@ -263,6 +263,8 @@ struct ares_channeldata {
   int nsort;
   char *lookups;
 
+  int optmask; /* the option bitfield passed in at init time */
+
   /* Server addresses and communications state */
   struct server_state *servers;
   int nservers;