diff --git a/src/t_string.c b/src/t_string.c
index a4c4a12cc..4ceb02fe3 100644
--- a/src/t_string.c
+++ b/src/t_string.c
@@ -405,7 +405,7 @@ void decrbyCommand(client *c) {
 
 void incrbyfloatCommand(client *c) {
     long double incr, value;
-    robj *o, *new, *aux;
+    robj *o, *new, *aux1, *aux2;
 
     o = lookupKeyWrite(c->db,c->argv[1]);
     if (o != NULL && checkType(c,o,OBJ_STRING)) return;
@@ -431,10 +431,13 @@ void incrbyfloatCommand(client *c) {
     /* Always replicate INCRBYFLOAT as a SET command with the final value
      * in order to make sure that differences in float precision or formatting
      * will not create differences in replicas or after an AOF restart. */
-    aux = createStringObject("SET",3);
-    rewriteClientCommandArgument(c,0,aux);
-    decrRefCount(aux);
+    aux1 = createStringObject("SET",3);
+    rewriteClientCommandArgument(c,0,aux1);
+    decrRefCount(aux1);
     rewriteClientCommandArgument(c,2,new);
+    aux2 = createStringObject("KEEPTTL",7);
+    rewriteClientCommandArgument(c,3,aux2);
+    decrRefCount(aux2);
 }
 
 void appendCommand(client *c) {
diff --git a/tests/integration/replication.tcl b/tests/integration/replication.tcl
index 4bd1f47f7..f69002b36 100644
--- a/tests/integration/replication.tcl
+++ b/tests/integration/replication.tcl
@@ -70,6 +70,13 @@ start_server {tags {"repl"}} {
             }
         }
 
+        test {INCRBYFLOAT replication, should not remove expire} {
+            r set test 1 EX 100
+            r incrbyfloat test 0.1
+            after 1000
+            assert_equal [$A debug digest] [$B debug digest]
+        }
+
         test {BRPOPLPUSH replication, when blocking against empty list} {
             set rd [redis_deferring_client]
             $rd brpoplpush a b 5