Index: test/test
===================================================================
--- test/test.orig
+++ test/test
@@ -369,4 +369,27 @@ test.log.$DATESTRING 0 zero
 EOF
 
 rm -rf testdir
+
+# check rotation with extension appended to the filename
+cleanup 15
+
+preptest test.log 15 1 0
+$RLR test-config.15 --force
+
+checkoutput <<EOF
+test.log 0
+test.log.1.newext 0 zero
+EOF
+
+# check rotation with extension moved after the number
+cleanup 16
+
+preptest test.log 16 1 0
+$RLR test-config.16 --force
+
+checkoutput <<EOF
+test.log 0
+test.1.log 0 zero
+EOF
+
 cleanup
Index: test/test-config.16.in
===================================================================
--- /dev/null
+++ test/test-config.16.in
@@ -0,0 +1,8 @@
+create
+
+&DIR&/test.log {
+    monthly
+    rotate 1
+    addextension .log
+}
+
Index: test/test-config.15.in
===================================================================
--- /dev/null
+++ test/test-config.15.in
@@ -0,0 +1,8 @@
+create
+
+&DIR&/test.log {
+    monthly
+    rotate 1
+    addextension .newext
+}
+
Index: config.c
===================================================================
--- config.c.orig
+++ config.c
@@ -434,6 +434,7 @@ int readAllConfigPaths(const char **path
 	/* first, last */ NULL, NULL,
 	/* logAddress */ NULL,
 	/* extension */ NULL,
+	/* addextension */ NULL,
 	/* compress_prog */ NULL,
 	/* uncompress_prog */ NULL,
 	/* compress_ext */ NULL,
@@ -1151,6 +1152,24 @@ static int readConfigFile(const char *co
 		message(MESS_DEBUG, "extension is now %s\n",
 			newlog->extension);
 
+	    } else if (!strcmp(start, "addextension")) {
+		*endtag = oldchar, start = endtag;
+
+		freeLogItem (addextension);
+
+		if (!isolateValue
+		    (configFile, lineNum, "addextension name", &start,
+		     &endtag)) {
+		    oldchar = *endtag, *endtag = '\0';
+
+		    newlog->addextension = strdup(start);
+
+		    *endtag = oldchar, start = endtag;
+		}
+
+		message(MESS_DEBUG, "addextension is now %s\n",
+			newlog->addextension);
+
 	    } else if (!strcmp(start, "compresscmd")) {
 		*endtag = oldchar, start = endtag;
 
Index: logrotate.8
===================================================================
--- logrotate.8.orig
+++ logrotate.8
@@ -142,6 +142,15 @@ Here is more information on the directiv
 a \fBlogrotate\fR configuration file:
 
 .TP
+\fBaddextension \fIext\fR
+Log files are given the final extension \fIext\fR after rotation. If
+the original file already ends with \fIext\fR, the extension is not
+duplicated, but merely moved to the end, i.e. both \fBfilename\fR and
+\fBfilename\fIext\fR would get rotated to filename.1\fIext\fR. If
+compression is used, the compression extension (normally \fB.gz\fR)
+appears after \fIext\fR.
+
+.TP
 \fBcompress\fR
 Old versions of log files are compressed with \fBgzip\fR by default. See also
 \fBnocompress\fR. 
Index: logrotate.c
===================================================================
--- logrotate.c.orig
+++ logrotate.c
@@ -618,6 +618,24 @@ int prerotateSingleLog(struct logInfo *l
 
     rotNames->baseName = strdup(ourBaseName(log->files[logNum]));
 
+    if (log->addextension) {
+        size_t baseLen = strlen(rotNames->baseName);
+	size_t extLen = strlen(log->addextension);
+	if (baseLen >= extLen &&
+	    strncmp(&(rotNames->baseName[baseLen - extLen]),
+	      log->addextension, extLen) == 0) {
+	char *tempstr;
+
+	fileext = log->addextension;
+	tempstr = calloc(baseLen - extLen + 1, sizeof(char));
+	strncat(tempstr, rotNames->baseName, baseLen - extLen);
+	free(rotNames->baseName);
+	rotNames->baseName = tempstr;
+	} else {
+	    fileext = log->addextension;
+	}
+    }
+
     oldName = alloca(PATH_MAX);
     newName = alloca(PATH_MAX);
     rotNames->disposeName = malloc(PATH_MAX);
Index: logrotate.h
===================================================================
--- logrotate.h.orig
+++ logrotate.h
@@ -41,6 +41,7 @@ struct logInfo {
     char *pre, *post, *first, *last;
     char *logAddress;
     char *extension;
+    char *addextension;
     char *compress_prog;
     char *uncompress_prog;
     char *compress_ext;
