Index: lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java	(revision 1468343)
+++ lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java	(working copy)
@@ -83,7 +83,7 @@
     try {
       CodecUtil.checkHeader(in, metaCodec, 
                                 Lucene42DocValuesConsumer.VERSION_START,
-                                Lucene42DocValuesConsumer.VERSION_START);
+                                Lucene42DocValuesConsumer.VERSION_CURRENT);
       numerics = new HashMap<Integer,NumericEntry>();
       binaries = new HashMap<Integer,BinaryEntry>();
       fsts = new HashMap<Integer,FSTEntry>();
@@ -101,7 +101,7 @@
     data = state.directory.openInput(dataName, state.context);
     CodecUtil.checkHeader(data, dataCodec, 
                                 Lucene42DocValuesConsumer.VERSION_START,
-                                Lucene42DocValuesConsumer.VERSION_START);
+                                Lucene42DocValuesConsumer.VERSION_CURRENT);
   }
   
   private void readFields(IndexInput meta, FieldInfos infos) throws IOException {
@@ -185,6 +185,16 @@
           return bytes[docID];
         }
       };
+    } else if (entry.format == Lucene42DocValuesConsumer.DATE_COMPRESSED) {
+      final int mult = data.readVInt();
+      final int blockSize = data.readVInt();
+      final BlockPackedReader reader = new BlockPackedReader(data, entry.packedIntsVersion, blockSize, maxDoc, false);
+      return new NumericDocValues() {
+        @Override
+        public long get(int docID) {
+          return mult * reader.get(docID);
+        }
+      };
     } else {
       throw new IllegalStateException();
     }
Index: lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesConsumer.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesConsumer.java	(revision 1468343)
+++ lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesConsumer.java	(working copy)
@@ -49,7 +49,8 @@
  */
 class Lucene42DocValuesConsumer extends DocValuesConsumer {
   static final int VERSION_START = 0;
-  static final int VERSION_CURRENT = VERSION_START;
+  static final int VERSION_PACKED_DATES = 1;
+  static final int VERSION_CURRENT = VERSION_PACKED_DATES;
   
   static final byte NUMBER = 0;
   static final byte BYTES = 1;
@@ -60,6 +61,7 @@
   static final byte DELTA_COMPRESSED = 0;
   static final byte TABLE_COMPRESSED = 1;
   static final byte UNCOMPRESSED = 2;
+  static final byte DATE_COMPRESSED = 3;
 
   final IndexOutput data, meta;
   final int maxDoc;
@@ -91,6 +93,7 @@
     meta.writeLong(data.getFilePointer());
     long minValue = Long.MAX_VALUE;
     long maxValue = Long.MIN_VALUE;
+    int gcd = 86400000;
     // TODO: more efficient?
     HashSet<Long> uniqueValues = new HashSet<Long>();
     for(Number nv : values) {
@@ -104,6 +107,20 @@
           }
         }
       }
+      if (gcd > 0) {
+        if (v % 86400000 == 0) {
+          // no time component (GMT)
+          gcd = Math.min(gcd, 86400000);
+        } else if (v % 3600000 == 0) {
+          // multiple of hour (e.g. local offset)
+          gcd = Math.min(gcd, 3600000);
+        } else if (v % 1000 == 0) {
+          // no milliseconds component
+          gcd = 1000;
+        } else {
+          gcd = 0;
+        }
+      }
     }
 
     if (uniqueValues != null) {
@@ -135,6 +152,17 @@
         }
         writer.finish();
       }
+    } else if (gcd > 0) {
+      meta.writeByte(DATE_COMPRESSED);
+      meta.writeVInt(PackedInts.VERSION_CURRENT);
+      data.writeVInt(gcd);
+      data.writeVInt(BLOCK_SIZE);
+
+      final BlockPackedWriter writer = new BlockPackedWriter(data, BLOCK_SIZE);
+      for (Number nv : values) {
+        writer.add(nv.longValue() / gcd);
+      }
+      writer.finish();
     } else {
       meta.writeByte(DELTA_COMPRESSED); // delta-compressed
 
