Merge pull request #448 from apache/revert_items_changes_prepare4.1.0

Revert items changes prepare4.1.0
diff --git a/src/main/java/org/apache/datasketches/hll/DirectCouponList.java b/src/main/java/org/apache/datasketches/hll/DirectCouponList.java
index b6cc64f..008aac1 100644
--- a/src/main/java/org/apache/datasketches/hll/DirectCouponList.java
+++ b/src/main/java/org/apache/datasketches/hll/DirectCouponList.java
@@ -122,7 +122,7 @@
         insertInt(wmem, LIST_INT_ARR_START + (i << 2), coupon);
         int couponCount = extractListCount(mem);
         insertListCount(wmem, ++couponCount);
-        insertEmptyFlag(wmem, false); //TODO only first time
+        insertEmptyFlag(wmem, false); //only first time
         if (couponCount >= len) { //array full
           if (lgConfigK < 8) {
             return promoteListOrSetToHll(this);//oooFlag = false
diff --git a/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java
index d9d8925..8ee358b 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java
@@ -20,7 +20,6 @@
 package org.apache.datasketches.kll;
 
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR;
-import static org.apache.datasketches.kll.KllPreambleUtil.DOUBLES_SKETCH_BIT_MASK;
 import static org.apache.datasketches.kll.KllPreambleUtil.PREAMBLE_INTS_FULL;
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_UPDATABLE;
 import static org.apache.datasketches.kll.KllPreambleUtil.UPDATABLE_BIT_MASK;
@@ -40,10 +39,10 @@
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryNumLevels;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryPreInts;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemorySerVer;
-import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_CALL;
 import static org.apache.datasketches.kll.KllSketch.Error.NOT_SINGLE_ITEM;
 import static org.apache.datasketches.kll.KllSketch.Error.TGT_IS_READ_ONLY;
 import static org.apache.datasketches.kll.KllSketch.Error.kllSketchThrow;
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 
 import org.apache.datasketches.common.Family;
 import org.apache.datasketches.memory.MemoryRequestServer;
@@ -84,7 +83,7 @@
     setMemoryPreInts(dstMem, PREAMBLE_INTS_FULL);
     setMemorySerVer(dstMem, SERIAL_VERSION_UPDATABLE);
     setMemoryFamilyID(dstMem, Family.KLL.getID());
-    setMemoryFlags(dstMem, DOUBLES_SKETCH_BIT_MASK | UPDATABLE_BIT_MASK);
+    setMemoryFlags(dstMem, UPDATABLE_BIT_MASK);
     setMemoryK(dstMem, k);
     setMemoryM(dstMem, m);
     setMemoryN(dstMem, 0);
@@ -96,7 +95,7 @@
     dstMem.putDoubleArray(offset, new double[] {Double.NaN, Double.NaN}, 0, 2);
     offset += 2 * Double.BYTES;
     dstMem.putDoubleArray(offset, new double[k], 0, k);
-    final KllMemoryValidate memVal = new KllMemoryValidate(dstMem);
+    final KllMemoryValidate memVal = new KllMemoryValidate(dstMem, DOUBLES_SKETCH);
     return new KllDirectDoublesSketch(dstMem, memReqSvr, memVal);
   }
 
@@ -129,9 +128,6 @@
   }
 
   @Override
-  float getFloatSingleItem() { kllSketchThrow(MUST_NOT_CALL); return Float.NaN; }
-
-  @Override
   int getM() {
     return getMemoryM(wmem);
   }
@@ -183,7 +179,7 @@
   void setDoubleItemsArrayAt(final int index, final double item) {
     if (readOnly) { kllSketchThrow(TGT_IS_READ_ONLY); }
     final int offset =
-        DATA_START_ADR + getLevelsArray().length * Integer.BYTES + 2 * Double.BYTES + index * Double.BYTES;
+        DATA_START_ADR + getLevelsArray().length * Integer.BYTES + (index + 2) * Double.BYTES;
     wmem.putDouble(offset, item);
   }
 
diff --git a/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java b/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java
index cbb6347..4d3fb54 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java
@@ -39,16 +39,15 @@
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryNumLevels;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryPreInts;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemorySerVer;
-import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_CALL;
 import static org.apache.datasketches.kll.KllSketch.Error.NOT_SINGLE_ITEM;
 import static org.apache.datasketches.kll.KllSketch.Error.TGT_IS_READ_ONLY;
 import static org.apache.datasketches.kll.KllSketch.Error.kllSketchThrow;
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 
 import org.apache.datasketches.common.Family;
 import org.apache.datasketches.memory.MemoryRequestServer;
 import org.apache.datasketches.memory.WritableMemory;
 
-//intentional extra line
 /**
  * This class implements an off-heap floats KllSketch via a WritableMemory instance of the sketch.
  *
@@ -96,7 +95,7 @@
     dstMem.putFloatArray(offset, new float[] {Float.NaN, Float.NaN}, 0, 2);
     offset += 2 * Float.BYTES;
     dstMem.putFloatArray(offset, new float[k], 0, k);
-    final KllMemoryValidate memVal = new KllMemoryValidate(dstMem);
+    final KllMemoryValidate memVal = new KllMemoryValidate(dstMem, FLOATS_SKETCH);
     return new KllDirectFloatsSketch(dstMem, memReqSvr, memVal);
   }
 
@@ -110,9 +109,6 @@
     return getMemoryN(wmem);
   }
 
-  @Override
-  double getDoubleSingleItem() { kllSketchThrow(MUST_NOT_CALL); return Double.NaN; }
-
   @Override //returns entire array including empty space at bottom
   float[] getFloatItemsArray() {
     final int capacityItems = levelsArr[getNumLevels()];
diff --git a/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java b/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
index 236b4c4..2006155 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
@@ -35,39 +35,41 @@
 final class KllDoublesHelper {
 
   //Called from KllSketch
-  static void mergeDoubleImpl(final KllDoublesSketch sketch, final KllSketch other) {
-    if (other.isEmpty()) { return; }
-    sketch.nullSortedView();
-    final long finalN = sketch.getN() + other.getN();
-    final int otherNumLevels = other.getNumLevels();
-    final int[] otherLevelsArr = other.getLevelsArray();
+  static void mergeDoubleImpl(final KllDoublesSketch mySketch, final KllSketch other) {
+    final KllDoublesSketch otherDblSk = (KllDoublesSketch) other;
+    if (otherDblSk.isEmpty()) { return; }
+    mySketch.nullSortedView();
+    final long finalN = mySketch.getN() + otherDblSk.getN();
+    final int otherNumLevels = otherDblSk.getNumLevels();
+    final int[] otherLevelsArr = otherDblSk.getLevelsArray();
     final double[] otherDoubleItemsArr;
     //capture my min & max, minK
-    final double myMin = sketch.isEmpty() ? Double.NaN : sketch.getMinDoubleItem();
-    final double myMax = sketch.isEmpty() ? Double.NaN : sketch.getMaxDoubleItem();
-    final int myMinK = sketch.getMinK();
+    final double myMin = mySketch.isEmpty() ? Double.NaN : mySketch.getMinDoubleItem();
+    final double myMax = mySketch.isEmpty() ? Double.NaN : mySketch.getMaxDoubleItem();
+    final int myMinK = mySketch.getMinK();
 
     //update this sketch with level0 items from the other sketch
-    if (other.isCompactSingleItem()) {
-      updateDouble(sketch, other.getDoubleSingleItem());
+
+    if (otherDblSk.isCompactSingleItem()) {
+      updateDouble(mySketch, otherDblSk.getDoubleSingleItem());
       otherDoubleItemsArr = new double[0];
     } else {
-      otherDoubleItemsArr = other.getDoubleItemsArray();
+      otherDoubleItemsArr = otherDblSk.getDoubleItemsArray();
       for (int i = otherLevelsArr[0]; i < otherLevelsArr[1]; i++) {
-        KllDoublesHelper.updateDouble(sketch, otherDoubleItemsArr[i]);
+        KllDoublesHelper.updateDouble(mySketch, otherDoubleItemsArr[i]);
       }
     }
     // after the level 0 update, we capture the state of levels and items arrays
-    final int myCurNumLevels = sketch.getNumLevels();
-    final int[] myCurLevelsArr = sketch.getLevelsArray();
-    final double[] myCurDoubleItemsArr = sketch.getDoubleItemsArray();
+    final int myCurNumLevels = mySketch.getNumLevels();
+    final int[] myCurLevelsArr = mySketch.getLevelsArray();
+    final double[] myCurDoubleItemsArr = mySketch.getDoubleItemsArray();
 
     int myNewNumLevels = myCurNumLevels;
     int[] myNewLevelsArr = myCurLevelsArr;
     double[] myNewDoubleItemsArr = myCurDoubleItemsArr;
 
-    if (otherNumLevels > 1 && !other.isCompactSingleItem()) { //now merge other levels if they exist
-      final int tmpSpaceNeeded = sketch.getNumRetained()
+    if (otherNumLevels > 1 && !otherDblSk.isCompactSingleItem()) { //now merge other levels if they exist
+      final int tmpSpaceNeeded = mySketch.getNumRetained()
           + KllHelper.getNumRetainedAboveLevelZero(otherNumLevels, otherLevelsArr);
       final double[] workbuf = new double[tmpSpaceNeeded];
       final int ub = KllHelper.ubOnNumLevels(finalN);
@@ -81,8 +83,8 @@
           otherNumLevels, otherLevelsArr, otherDoubleItemsArr);
 
       // notice that workbuf is being used as both the input and output
-      final int[] result = generalDoublesCompress(sketch.getK(), sketch.getM(), provisionalNumLevels,
-          workbuf, worklevels, workbuf, outlevels, sketch.isLevelZeroSorted(), KllSketch.random);
+      final int[] result = generalDoublesCompress(mySketch.getK(), mySketch.getM(), provisionalNumLevels,
+          workbuf, worklevels, workbuf, outlevels, mySketch.isLevelZeroSorted(), KllSketch.random);
       final int targetItemCount = result[1]; //was finalCapacity. Max size given k, m, numLevels
       final int curItemCount = result[2]; //was finalPop
 
@@ -113,28 +115,28 @@
       }
 
       //MEMORY SPACE MANAGEMENT
-      if (sketch.updatableMemFormat) {
-        sketch.wmem = KllHelper.memorySpaceMgmt(sketch, myNewLevelsArr.length, myNewDoubleItemsArr.length);
+      if (mySketch.updatableMemFormat) {
+        mySketch.wmem = KllHelper.memorySpaceMgmt(mySketch, myNewLevelsArr.length, myNewDoubleItemsArr.length);
       }
     }
 
     //Update Preamble:
-    sketch.setN(finalN);
-    if (other.isEstimationMode()) { //otherwise the merge brings over exact items.
-      sketch.setMinK(min(myMinK, other.getMinK()));
+    mySketch.setN(finalN);
+    if (otherDblSk.isEstimationMode()) { //otherwise the merge brings over exact items.
+      mySketch.setMinK(min(myMinK, otherDblSk.getMinK()));
     }
 
     //Update numLevels, levelsArray, items
-    sketch.setNumLevels(myNewNumLevels);
-    sketch.setLevelsArray(myNewLevelsArr);
-    sketch.setDoubleItemsArray(myNewDoubleItemsArr);
+    mySketch.setNumLevels(myNewNumLevels);
+    mySketch.setLevelsArray(myNewLevelsArr);
+    mySketch.setDoubleItemsArray(myNewDoubleItemsArr);
 
     //Update min, max items
-    final double otherMin = other.getMinDoubleItem();
-    final double otherMax = other.getMaxDoubleItem();
-    sketch.setMinDoubleItem(resolveDoubleMinItem(myMin, otherMin));
-    sketch.setMaxDoubleItem(resolveDoubleMaxItem(myMax, otherMax));
-    assert KllHelper.sumTheSampleWeights(sketch.getNumLevels(), sketch.getLevelsArray()) == sketch.getN();
+    final double otherMin = otherDblSk.getMinDoubleItem();
+    final double otherMax = otherDblSk.getMaxDoubleItem();
+    mySketch.setMinDoubleItem(resolveDoubleMinItem(myMin, otherMin));
+    mySketch.setMaxDoubleItem(resolveDoubleMaxItem(myMax, otherMax));
+    assert KllHelper.sumTheSampleWeights(mySketch.getNumLevels(), mySketch.getLevelsArray()) == mySketch.getN();
   }
 
   //Called from KllHelper and this.generalDoublesCompress(...), this.populateDoubleWorkArrays(...)
@@ -170,13 +172,13 @@
   }
 
   /**
-   * Validation Method. This must be modified to test validation
+   * Validation Method. This must be modified to use the validation test
    * @param buf the items array
    * @param start data start
    * @param length items array length
    * @param random instance of Random
    */
-  //NOTE Validation Method: Need to modify.
+  //NOTE Validation Method: Need to modify to run.
   //Called from KllHelper, this.generalDoublesCompress(...)
   static void randomlyHalveDownDoubles(final double[] buf, final int start, final int length, final Random random) {
     assert isEven(length);
@@ -191,13 +193,13 @@
   }
 
   /**
-   * Validation Method. This must be modified to test validation
+   * Validation Method. This must be modified to use the validation test
    * @param buf the items array
    * @param start data start
    * @param length items array length
    * @param random instance of Random
    */
-  //NOTE Validation Method: Need to modify.
+  //NOTE Validation Method: Need to modify to run.
   //Called from KllHelper, this.generalDoublesCompress(...)
   static void randomlyHalveUpDoubles(final double[] buf, final int start, final int length, final Random random) {
     assert isEven(length);
@@ -212,20 +214,20 @@
   }
 
   //Called from KllDoublesSketch, this.mergeDoubleImpl(...)
-  static void updateDouble(final KllSketch sketch, final double item) {
+  static void updateDouble(final KllDoublesSketch dblSk, final double item) {
     if (Double.isNaN(item)) { return; }
-    final double prevMin = sketch.getMinDoubleItem();
-    final double prevMax = sketch.getMaxDoubleItem();
-    sketch.setMinDoubleItem(resolveDoubleMinItem(prevMin, item));
-    sketch.setMaxDoubleItem(resolveDoubleMaxItem(prevMax, item));
-    if (sketch.getLevelsArray()[0] == 0) { KllHelper.compressWhileUpdatingSketch(sketch); }
-    final int myLevelsArrAtZero = sketch.getLevelsArray()[0]; //LevelsArr could be expanded
-    sketch.incN();
-    sketch.setLevelZeroSorted(false);
+    final double prevMin = dblSk.getMinDoubleItem();
+    final double prevMax = dblSk.getMaxDoubleItem();
+    dblSk.setMinDoubleItem(resolveDoubleMinItem(prevMin, item));
+    dblSk.setMaxDoubleItem(resolveDoubleMaxItem(prevMax, item));
+    if (dblSk.getLevelsArray()[0] == 0) { KllHelper.compressWhileUpdatingSketch(dblSk); }
+    final int myLevelsArrAtZero = dblSk.getLevelsArray()[0]; //LevelsArr could be expanded
+    dblSk.incN();
+    dblSk.setLevelZeroSorted(false);
     final int nextPos = myLevelsArrAtZero - 1;
     assert myLevelsArrAtZero >= 0;
-    sketch.setLevelsArrayAt(0, nextPos);
-    sketch.setDoubleItemsArrayAt(nextPos, item);
+    dblSk.setLevelsArrayAt(0, nextPos);
+    dblSk.setDoubleItemsArrayAt(nextPos, item);
   }
 
   /**
@@ -395,7 +397,7 @@
    * The following must be enabled for use with the KllDoublesValidationTest,
    * which is only enabled for manual testing. In addition, two Validation Methods
    * above need to be modified.
-   */ //NOTE Validation Method: Need to uncomment
+   */ //NOTE Validation Method: Need to uncomment to use
   //    static int nextOffset = 0;
   //
   //    private static int deterministicOffset() {
diff --git a/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
index dbba6d1..47e86aa 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
@@ -23,9 +23,9 @@
 import static java.lang.Math.min;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryUpdatableFormatFlag;
 import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_BE_UPDATABLE_FORMAT;
-import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_CALL;
 import static org.apache.datasketches.kll.KllSketch.Error.TGT_IS_READ_ONLY;
 import static org.apache.datasketches.kll.KllSketch.Error.kllSketchThrow;
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 import static org.apache.datasketches.quantilescommon.QuantilesUtil.THROWS_EMPTY;
 import static org.apache.datasketches.quantilescommon.QuantilesUtil.equallyWeightedRanks;
 
@@ -53,20 +53,9 @@
   }
 
   /**
-   * Returns upper bound on the serialized size of a KllDoublesSketch given the following parameters.
-   * @param k parameter that controls size of the sketch and accuracy of estimates
-   * @param n stream length
-   * @param updatableMemoryFormat true if updatable Memory format, otherwise the standard compact format.
-   * @return upper bound on the serialized size of a KllSketch.
-   */
-  public static int getMaxSerializedSizeBytes(final int k, final long n, final boolean updatableMemoryFormat) {
-    return getMaxSerializedSizeBytes(k, n, SketchType.DOUBLES_SKETCH, updatableMemoryFormat);
-  }
-
-  /**
-   * Factory heapify takes the sketch image in Memory and instantiates an on-heap sketch.
+   * Factory heapify takes a compact sketch image in Memory and instantiates an on-heap sketch.
    * The resulting sketch will not retain any link to the source Memory.
-   * @param srcMem a Memory image of a sketch serialized by this sketch.
+   * @param srcMem a compact Memory image of a sketch serialized by this sketch.
    * <a href="{@docRoot}/resources/dictionary.html#mem">See Memory</a>
    * @return a heap-based sketch based on the given Memory.
    */
@@ -111,7 +100,7 @@
   /**
    * Create a new heap instance of this sketch with the default <em>k = 200</em>.
    * The default <em>k</em> = 200 results in a normalized rank error of about
-   * 1.65%. Larger of K will have smaller error but the sketch will be larger (and slower).
+   * 1.65%. Larger K will have smaller error but the sketch will be larger (and slower).
    * This will have a rank error of about 1.65%.
    * @return new KllDoublesSketch on the heap.
    */
@@ -123,7 +112,7 @@
    * Create a new heap instance of this sketch with a given parameter <em>k</em>.
    * <em>k</em> can be between DEFAULT_M and 65535, inclusive.
    * The default <em>k</em> = 200 results in a normalized rank error of about
-   * 1.65%. Larger of K will have smaller error but the sketch will be larger (and slower).
+   * 1.65%. Larger K will have smaller error but the sketch will be larger (and slower).
    * @param k parameter that controls size of the sketch and accuracy of estimates.
    * @return new KllDoublesSketch on the heap.
    */
@@ -132,14 +121,14 @@
   }
 
   /**
-   * Wrap a sketch around the given read only source Memory containing sketch data
+   * Wrap a sketch around the given read only compact source Memory containing sketch data
    * that originated from this sketch.
    * @param srcMem the read only source Memory
    * @return instance of this sketch
    */
   public static KllDoublesSketch wrap(final Memory srcMem) {
     Objects.requireNonNull(srcMem, "Parameter 'srcMem' must not be null");
-    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem);
+    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem, DOUBLES_SKETCH);
     if (memVal.updatableMemFormat) {
       return new KllDirectDoublesSketch((WritableMemory) srcMem, null, memVal);
     } else {
@@ -148,8 +137,8 @@
   }
 
   /**
-   * Wrap a sketch around the given source Memory containing sketch data that originated from
-   * this sketch.
+   * Wrap a sketch around the given source Writable Memory containing sketch data
+   * that originated from this sketch.
    * @param srcMem a WritableMemory that contains data.
    * @param memReqSvr the given MemoryRequestServer to request a larger WritableMemory
    * @return instance of this sketch
@@ -158,7 +147,7 @@
       final WritableMemory srcMem,
       final MemoryRequestServer memReqSvr) {
     Objects.requireNonNull(srcMem, "Parameter 'srcMem' must not be null");
-    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem);
+    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem, DOUBLES_SKETCH);
     if (memVal.updatableMemFormat) {
       if (!memVal.readOnly) {
         Objects.requireNonNull(memReqSvr, "Parameter 'memReqSvr' must not be null");
@@ -169,6 +158,17 @@
     }
   }
 
+  /**
+   * Returns upper bound on the serialized size of a KllDoublesSketch given the following parameters.
+   * @param k parameter that controls size of the sketch and accuracy of estimates
+   * @param n stream length
+   * @param updatableMemoryFormat true if updatable Memory format, otherwise the standard compact format.
+   * @return upper bound on the serialized size of a KllSketch.
+   */
+  public static int getMaxSerializedSizeBytes(final int k, final long n, final boolean updatableMemoryFormat) {
+    return getMaxSerializedSizeBytes(k, n, SketchType.DOUBLES_SKETCH, updatableMemoryFormat);
+  }
+
   @Override
   public double[] getCDF(final double[] splitPoints, final QuantileSearchCriteria searchCrit) {
     if (isEmpty()) { throw new IllegalArgumentException(THROWS_EMPTY); }
@@ -289,10 +289,35 @@
   }
 
   @Override
+  @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "OK in this case.")
+  public DoublesSortedView getSortedView() {
+    refreshSortedView();
+    return kllDoublesSV;
+  }
+
+  @Override
   public QuantilesDoublesSketchIterator iterator() {
     return new KllDoublesSketchIterator(getDoubleItemsArray(), getLevelsArray(), getNumLevels());
   }
 
+  /**
+   * {@inheritDoc}
+   * <p>The parameter <i>k</i> will not change.</p>
+   */
+  @Override
+  public final void reset() {
+    if (readOnly) { kllSketchThrow(TGT_IS_READ_ONLY); }
+    final int k = getK();
+    setN(0);
+    setMinK(k);
+    setNumLevels(1);
+    setLevelZeroSorted(false);
+    setLevelsArray(new int[] {k, k});
+    setMinDoubleItem(Double.NaN);
+    setMaxDoubleItem(Double.NaN);
+    setDoubleItemsArray(new double[k]);
+  }
+
   @Override
   public byte[] toByteArray() {
     return KllHelper.toCompactByteArrayImpl(this);
@@ -305,38 +330,31 @@
     kllDoublesSV = null;
   }
 
-  @Override
-  @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "OK in this case.")
-  public DoublesSortedView getSortedView() {
-    refreshSortedView();
-    return kllDoublesSV;
-  }
+  //restricted
 
-  void nullSortedView() { kllDoublesSV = null; }
+  /**
+   * @return full size of internal items array including garbage.
+   */
+  abstract double[] getDoubleItemsArray();
 
-  @Override //Artifact of inheritance
-  float[] getFloatItemsArray() { kllSketchThrow(MUST_NOT_CALL); return null; }
+  abstract double getDoubleSingleItem();
 
-  @Override //Artifact of inheritance
-  float getMaxFloatItem() { kllSketchThrow(MUST_NOT_CALL); return Float.NaN; }
+  abstract double getMaxDoubleItem();
 
-  @Override //Artifact of inheritance
-  float getMinFloatItem() { kllSketchThrow(MUST_NOT_CALL); return Float.NaN; }
-
-  @Override //Artifact of inheritance
-  void setFloatItemsArray(final float[] floatItems) { kllSketchThrow(MUST_NOT_CALL); }
-
-  @Override //Artifact of inheritance
-  void setFloatItemsArrayAt(final int index, final float item) { kllSketchThrow(MUST_NOT_CALL); }
-
-  @Override //Artifact of inheritance
-  void setMaxFloatItem(final float item) { kllSketchThrow(MUST_NOT_CALL); }
-
-  @Override //Artifact of inheritance
-  void setMinFloatItem(final float item) { kllSketchThrow(MUST_NOT_CALL); }
+  abstract double getMinDoubleItem();
 
   private final void refreshSortedView() {
     kllDoublesSV = (kllDoublesSV == null) ? new KllDoublesSketchSortedView(this) : kllDoublesSV;
   }
 
+  abstract void setDoubleItemsArray(double[] doubleItems);
+
+  abstract void setDoubleItemsArrayAt(int index, double item);
+
+  abstract void setMaxDoubleItem(double item);
+
+  abstract void setMinDoubleItem(double item);
+
+  void nullSortedView() { kllDoublesSV = null; }
+
 }
diff --git a/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java b/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java
index 321e152..1e399ab 100644
--- a/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java
@@ -35,39 +35,40 @@
 final class KllFloatsHelper {
 
   //Called from KllSketch
-  static void mergeFloatImpl(final KllFloatsSketch sketch, final KllSketch other) {
-    if (other.isEmpty()) { return; }
-    sketch.nullSortedView();
-    final long finalN = sketch.getN() + other.getN();
-    final int otherNumLevels = other.getNumLevels();
-    final int[] otherLevelsArr = other.getLevelsArray();
+  static void mergeFloatImpl(final KllFloatsSketch mySketch, final KllSketch other) {
+    final KllFloatsSketch otherFltSk = (KllFloatsSketch) other;
+    if (otherFltSk.isEmpty()) { return; }
+    mySketch.nullSortedView();
+    final long finalN = mySketch.getN() + otherFltSk.getN();
+    final int otherNumLevels = otherFltSk.getNumLevels();
+    final int[] otherLevelsArr = otherFltSk.getLevelsArray();
     final float[] otherFloatItemsArr;
     //capture my min & max, minK
-    final float myMin = sketch.isEmpty() ? Float.NaN : sketch.getMinFloatItem();
-    final float myMax = sketch.isEmpty() ? Float.NaN : sketch.getMaxFloatItem();
-    final int myMinK = sketch.getMinK();
+    final float myMin = mySketch.isEmpty() ? Float.NaN : mySketch.getMinFloatItem();
+    final float myMax = mySketch.isEmpty() ? Float.NaN : mySketch.getMaxFloatItem();
+    final int myMinK = mySketch.getMinK();
 
     //update this sketch with level0 items from the other sketch
-    if (other.isCompactSingleItem()) {
-      updateFloat(sketch, other.getFloatSingleItem());
+    if (otherFltSk.isCompactSingleItem()) {
+      updateFloat(mySketch, otherFltSk.getFloatSingleItem());
       otherFloatItemsArr = new float[0];
     } else {
-      otherFloatItemsArr = other.getFloatItemsArray();
+      otherFloatItemsArr = otherFltSk.getFloatItemsArray();
       for (int i = otherLevelsArr[0]; i < otherLevelsArr[1]; i++) {
-       updateFloat(sketch, otherFloatItemsArr[i]);
+       updateFloat(mySketch, otherFloatItemsArr[i]);
       }
     }
     // after the level 0 update, we capture the state of levels and items arrays
-    final int myCurNumLevels = sketch.getNumLevels();
-    final int[] myCurLevelsArr = sketch.getLevelsArray();
-    final float[] myCurFloatItemsArr = sketch.getFloatItemsArray();
+    final int myCurNumLevels = mySketch.getNumLevels();
+    final int[] myCurLevelsArr = mySketch.getLevelsArray();
+    final float[] myCurFloatItemsArr = mySketch.getFloatItemsArray();
 
     int myNewNumLevels = myCurNumLevels;
     int[] myNewLevelsArr = myCurLevelsArr;
     float[] myNewFloatItemsArr = myCurFloatItemsArr;
 
-    if (otherNumLevels > 1  && !other.isCompactSingleItem()) { //now merge higher levels if they exist
-      final int tmpSpaceNeeded = sketch.getNumRetained()
+    if (otherNumLevels > 1  && !otherFltSk.isCompactSingleItem()) { //now merge higher levels if they exist
+      final int tmpSpaceNeeded = mySketch.getNumRetained()
           + KllHelper.getNumRetainedAboveLevelZero(otherNumLevels, otherLevelsArr);
       final float[] workbuf = new float[tmpSpaceNeeded];
       final int ub = KllHelper.ubOnNumLevels(finalN);
@@ -81,8 +82,8 @@
           otherNumLevels, otherLevelsArr, otherFloatItemsArr);
 
       // notice that workbuf is being used as both the input and output
-      final int[] result = generalFloatsCompress(sketch.getK(), sketch.getM(), provisionalNumLevels,
-          workbuf, worklevels, workbuf, outlevels, sketch.isLevelZeroSorted(), KllSketch.random);
+      final int[] result = generalFloatsCompress(mySketch.getK(), mySketch.getM(), provisionalNumLevels,
+          workbuf, worklevels, workbuf, outlevels, mySketch.isLevelZeroSorted(), KllSketch.random);
       final int targetItemCount = result[1]; //was finalCapacity. Max size given k, m, numLevels
       final int curItemCount = result[2]; //was finalPop
 
@@ -113,28 +114,28 @@
       }
 
       //MEMORY SPACE MANAGEMENT
-      if (sketch.updatableMemFormat) {
-        sketch.wmem = KllHelper.memorySpaceMgmt(sketch, myNewLevelsArr.length, myNewFloatItemsArr.length);
+      if (mySketch.updatableMemFormat) {
+        mySketch.wmem = KllHelper.memorySpaceMgmt(mySketch, myNewLevelsArr.length, myNewFloatItemsArr.length);
       }
     }
 
     //Update Preamble:
-    sketch.setN(finalN);
-    if (other.isEstimationMode()) { //otherwise the merge brings over exact items.
-      sketch.setMinK(min(myMinK, other.getMinK()));
+    mySketch.setN(finalN);
+    if (otherFltSk.isEstimationMode()) { //otherwise the merge brings over exact items.
+      mySketch.setMinK(min(myMinK, otherFltSk.getMinK()));
     }
 
     //Update numLevels, levelsArray, items
-    sketch.setNumLevels(myNewNumLevels);
-    sketch.setLevelsArray(myNewLevelsArr);
-    sketch.setFloatItemsArray(myNewFloatItemsArr);
+    mySketch.setNumLevels(myNewNumLevels);
+    mySketch.setLevelsArray(myNewLevelsArr);
+    mySketch.setFloatItemsArray(myNewFloatItemsArr);
 
     //Update min, max items
-    final float otherMin = other.getMinFloatItem();
-    final float otherMax = other.getMaxFloatItem();
-    sketch.setMinFloatItem(resolveFloatMinItem(myMin, otherMin));
-    sketch.setMaxFloatItem(resolveFloatMaxItem(myMax, otherMax));
-    assert KllHelper.sumTheSampleWeights(sketch.getNumLevels(), sketch.getLevelsArray()) == sketch.getN();
+    final float otherMin = otherFltSk.getMinFloatItem();
+    final float otherMax = otherFltSk.getMaxFloatItem();
+    mySketch.setMinFloatItem(resolveFloatMinItem(myMin, otherMin));
+    mySketch.setMaxFloatItem(resolveFloatMaxItem(myMax, otherMax));
+    assert KllHelper.sumTheSampleWeights(mySketch.getNumLevels(), mySketch.getLevelsArray()) == mySketch.getN();
   }
 
   //Called from KllHelper and this.generalFloatssCompress(...), this.populateFloatWorkArrays(...)
@@ -176,7 +177,7 @@
    * @param length items array length
    * @param random instance of Random
    */
-  //NOTE: Validation Method: Need to modify to run.
+  //NOTE Validation Method: Need to modify to run.
   //Called from KllHelper, this.generalFloatsCompress(...)
   static void randomlyHalveDownFloats(final float[] buf, final int start, final int length, final Random random) {
     assert isEven(length);
@@ -212,20 +213,20 @@
   }
 
   //Called from KllFloatsSketch, this.mergeFloatImpl(...)
-  static void updateFloat(final KllSketch sketch, final float item) {
+  static void updateFloat(final KllFloatsSketch fltSk, final float item) {
     if (Float.isNaN(item)) { return; }
-    final float prevMin = sketch.getMinFloatItem();
-    final float prevMax = sketch.getMaxFloatItem();
-    sketch.setMinFloatItem(resolveFloatMinItem(prevMin, item));
-    sketch.setMaxFloatItem(resolveFloatMaxItem(prevMax, item));
-    if (sketch.getLevelsArray()[0] == 0) { KllHelper.compressWhileUpdatingSketch(sketch); }
-    final int myLevelsArrAtZero = sketch.getLevelsArray()[0]; //LevelsArr could be expanded
-    sketch.incN();
-    sketch.setLevelZeroSorted(false);
+    final float prevMin = fltSk.getMinFloatItem();
+    final float prevMax = fltSk.getMaxFloatItem();
+    fltSk.setMinFloatItem(resolveFloatMinItem(prevMin, item));
+    fltSk.setMaxFloatItem(resolveFloatMaxItem(prevMax, item));
+    if (fltSk.getLevelsArray()[0] == 0) { KllHelper.compressWhileUpdatingSketch(fltSk); }
+    final int myLevelsArrAtZero = fltSk.getLevelsArray()[0]; //LevelsArr could be expanded
+    fltSk.incN();
+    fltSk.setLevelZeroSorted(false);
     final int nextPos = myLevelsArrAtZero - 1;
     assert myLevelsArrAtZero >= 0;
-    sketch.setLevelsArrayAt(0, nextPos);
-    sketch.setFloatItemsArrayAt(nextPos, item);
+    fltSk.setLevelsArrayAt(0, nextPos);
+    fltSk.setFloatItemsArrayAt(nextPos, item);
   }
 
   /**
@@ -393,7 +394,7 @@
   /*
    * Validation Method.
    * The following must be enabled for use with the KllFloatsValidationTest,
-   * which is only enabled for manual testing. In addition, two methods
+   * which is only enabled for manual testing. In addition, two Validation Methods
    * above need to be modified.
    */ //NOTE Validation Method: Need to uncomment to use
   //    static int nextOffset = 0;
diff --git a/src/main/java/org/apache/datasketches/kll/KllFloatsSketch.java b/src/main/java/org/apache/datasketches/kll/KllFloatsSketch.java
index eed0e4f..8ff0ccf 100644
--- a/src/main/java/org/apache/datasketches/kll/KllFloatsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllFloatsSketch.java
@@ -23,9 +23,9 @@
 import static java.lang.Math.min;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryUpdatableFormatFlag;
 import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_BE_UPDATABLE_FORMAT;
-import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_CALL;
 import static org.apache.datasketches.kll.KllSketch.Error.TGT_IS_READ_ONLY;
 import static org.apache.datasketches.kll.KllSketch.Error.kllSketchThrow;
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 import static org.apache.datasketches.quantilescommon.QuantilesUtil.THROWS_EMPTY;
 import static org.apache.datasketches.quantilescommon.QuantilesUtil.equallyWeightedRanks;
 
@@ -53,20 +53,9 @@
   }
 
   /**
-   * Returns upper bound on the serialized size of a KllFloatsSketch given the following parameters.
-   * @param k parameter that controls size of the sketch and accuracy of estimates
-   * @param n stream length
-   * @param updatableMemoryFormat true if updatable Memory format, otherwise the standard compact format.
-   * @return upper bound on the serialized size of a KllSketch.
-   */
-  public static int getMaxSerializedSizeBytes(final int k, final long n, final boolean updatableMemoryFormat) {
-    return getMaxSerializedSizeBytes(k, n, SketchType.FLOATS_SKETCH, updatableMemoryFormat);
-  }
-
-  /**
-   * Factory heapify takes the sketch image in Memory and instantiates an on-heap sketch.
+   * Factory heapify takes a compact sketch image in Memory and instantiates an on-heap sketch.
    * The resulting sketch will not retain any link to the source Memory.
-   * @param srcMem a Memory image of a sketch serialized by this sketch.
+   * @param srcMem a compact Memory image of a sketch serialized by this sketch.
    * <a href="{@docRoot}/resources/dictionary.html#mem">See Memory</a>
    * @return a heap-based sketch based on the given Memory.
    */
@@ -132,14 +121,14 @@
   }
 
   /**
-   * Wrap a sketch around the given read only source Memory containing sketch data
+   * Wrap a sketch around the given read only compact source Memory containing sketch data
    * that originated from this sketch.
    * @param srcMem the read only source Memory
    * @return instance of this sketch
    */
   public static KllFloatsSketch wrap(final Memory srcMem) {
     Objects.requireNonNull(srcMem, "Parameter 'srcMem' must not be null");
-    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem);
+    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem, FLOATS_SKETCH);
     if (memVal.updatableMemFormat) {
       return new KllDirectFloatsSketch((WritableMemory) srcMem, null, memVal);
     } else {
@@ -158,7 +147,7 @@
       final WritableMemory srcMem,
       final MemoryRequestServer memReqSvr) {
     Objects.requireNonNull(srcMem, "Parameter 'srcMem' must not be null");
-    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem);
+    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem, FLOATS_SKETCH);
     if (memVal.updatableMemFormat) {
       if (!memVal.readOnly) {
         Objects.requireNonNull(memReqSvr, "Parameter 'memReqSvr' must not be null");
@@ -169,6 +158,17 @@
     }
   }
 
+  /**
+   * Returns upper bound on the serialized size of a KllFloatsSketch given the following parameters.
+   * @param k parameter that controls size of the sketch and accuracy of estimates
+   * @param n stream length
+   * @param updatableMemoryFormat true if updatable Memory format, otherwise the standard compact format.
+   * @return upper bound on the serialized size of a KllSketch.
+   */
+  public static int getMaxSerializedSizeBytes(final int k, final long n, final boolean updatableMemoryFormat) {
+    return getMaxSerializedSizeBytes(k, n, SketchType.FLOATS_SKETCH, updatableMemoryFormat);
+  }
+
   @Override
   public double[] getCDF(final float[] splitPoints, final QuantileSearchCriteria searchCrit) {
     if (isEmpty()) { throw new IllegalArgumentException(THROWS_EMPTY); }
@@ -289,10 +289,35 @@
   }
 
   @Override
+  @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "OK in this case.")
+  public FloatsSortedView getSortedView() {
+    refreshSortedView();
+    return kllFloatsSV;
+  }
+
+  @Override
   public QuantilesFloatsSketchIterator iterator() {
     return new KllFloatsSketchIterator(getFloatItemsArray(), getLevelsArray(), getNumLevels());
   }
 
+  /**
+   * {@inheritDoc}
+   * <p>The parameter <i>k</i> will not change.</p>
+   */
+  @Override
+  public final void reset() {
+    if (readOnly) { kllSketchThrow(TGT_IS_READ_ONLY); }
+    final int k = getK();
+    setN(0);
+    setMinK(k);
+    setNumLevels(1);
+    setLevelZeroSorted(false);
+    setLevelsArray(new int[] {k, k});
+    setMinFloatItem(Float.NaN);
+    setMaxFloatItem(Float.NaN);
+    setFloatItemsArray(new float[k]);
+  }
+
   @Override
   public byte[] toByteArray() {
     return KllHelper.toCompactByteArrayImpl(this);
@@ -305,38 +330,31 @@
     kllFloatsSV = null;
   }
 
-  @Override
-  @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "OK in this case.")
-  public FloatsSortedView getSortedView() {
-    refreshSortedView();
-    return kllFloatsSV;
-  }
+  //restricted
 
-  void nullSortedView() { kllFloatsSV = null; }
+  /**
+   * @return full size of internal items array including garbage.
+   */
+  abstract float[] getFloatItemsArray();
 
-  @Override //Artifact of inheritance
-  double[] getDoubleItemsArray() { kllSketchThrow(MUST_NOT_CALL); return null; }
+  abstract float getFloatSingleItem();
 
-  @Override //Artifact of inheritance
-  double getMaxDoubleItem() { kllSketchThrow(MUST_NOT_CALL); return Double.NaN; }
+  abstract float getMaxFloatItem();
 
-  @Override //Artifact of inheritance
-  double getMinDoubleItem() { kllSketchThrow(MUST_NOT_CALL); return Double.NaN; }
-
-  @Override //Artifact of inheritance
-  void setDoubleItemsArray(final double[] doubleItems) { kllSketchThrow(MUST_NOT_CALL); }
-
-  @Override //Artifact of inheritance
-  void setDoubleItemsArrayAt(final int index, final double item) { kllSketchThrow(MUST_NOT_CALL); }
-
-  @Override //Artifact of inheritance
-  void setMaxDoubleItem(final double item) { kllSketchThrow(MUST_NOT_CALL); }
-
-  @Override //Artifact of inheritance
-  void setMinDoubleItem(final double item) { kllSketchThrow(MUST_NOT_CALL); }
+  abstract float getMinFloatItem();
 
   private final void refreshSortedView() {
     kllFloatsSV = (kllFloatsSV == null) ? new KllFloatsSketchSortedView(this) : kllFloatsSV;
   }
 
+  abstract void setFloatItemsArray(float[] floatItems);
+
+  abstract void setFloatItemsArrayAt(int index, float item);
+
+  abstract void setMaxFloatItem(float item);
+
+  abstract void setMinFloatItem(float item);
+
+  void nullSortedView() { kllFloatsSV = null; }
+
 }
diff --git a/src/main/java/org/apache/datasketches/kll/KllFloatsSketchSortedView.java b/src/main/java/org/apache/datasketches/kll/KllFloatsSketchSortedView.java
index 5a7f0e8..185f216 100644
--- a/src/main/java/org/apache/datasketches/kll/KllFloatsSketchSortedView.java
+++ b/src/main/java/org/apache/datasketches/kll/KllFloatsSketchSortedView.java
@@ -82,7 +82,7 @@
     final InequalitySearch crit = (searchCrit == INCLUSIVE) ? InequalitySearch.GE : InequalitySearch.GT;
     final int index = InequalitySearch.find(cumWeights, 0, len - 1, naturalRank, crit);
     if (index == -1) {
-      return quantiles[quantiles.length - 1]; ///EXCLUSIVE (GT) case: normRank == 1.0;
+      return quantiles[quantiles.length - 1]; //EXCLUSIVE (GT) case: normRank == 1.0;
     }
     return quantiles[index];
   }
diff --git a/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java
index 1882b0e..2b18fe2 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java
@@ -21,10 +21,9 @@
 
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR_SINGLE_ITEM;
-import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_CALL;
 import static org.apache.datasketches.kll.KllSketch.Error.NOT_SINGLE_ITEM;
-import static org.apache.datasketches.kll.KllSketch.Error.SRC_MUST_BE_DOUBLE;
 import static org.apache.datasketches.kll.KllSketch.Error.kllSketchThrow;
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 
 import java.util.Objects;
 
@@ -39,14 +38,14 @@
  * @author Lee Rhodes, Kevin Lang
  */
 final class KllHeapDoublesSketch extends KllDoublesSketch {
-  private final int k_;    // configured size of K.
-  private final int m_;    // configured size of M.
-  private long n_;        // number of items input into this sketch.
+  private final int k_; // configured size of K.
+  private final int m_; // configured size of M.
+  private long n_;      // number of items input into this sketch.
   private int minK_;    // dynamic minK for error estimation after merging with different k.
   private boolean isLevelZeroSorted_;
-  private double minItem_;
-  private double maxItem_;
-  private double[] quantiles_;
+  private double minDoubleItem_;
+  private double maxDoubleItem_;
+  private double[] doubleItems_;
 
   /**
    * New instance heap constructor with a given parameters <em>k</em> and <em>m</em>.
@@ -69,18 +68,18 @@
     minK_ = k;
     isLevelZeroSorted_ = false;
     levelsArr = new int[] {k, k};
-    minItem_ = Double.NaN;
-    maxItem_ = Double.NaN;
-    quantiles_ = new double[k];
+    minDoubleItem_ = Double.NaN;
+    maxDoubleItem_ = Double.NaN;
+    doubleItems_ = new double[k];
   }
 
   /**
    * Heapify constructor.
    * @param srcMem Memory object that contains data serialized by this sketch.
-   * @param memValidate the MemoryVaidate object
+   * @param memValidate the MemoryValidate object
    */
   private KllHeapDoublesSketch(final Memory srcMem, final KllMemoryValidate memValidate) {
-    super(null, null );
+    super(null, null);
     k_ = memValidate.k;
     m_ = memValidate.m;
     n_ = memValidate.n;
@@ -90,40 +89,39 @@
     final boolean updatableMemFormat = memValidate.updatableMemFormat;
 
     if (memValidate.empty && !updatableMemFormat) {
-      minItem_ = Double.NaN;
-      maxItem_ = Double.NaN;
-      quantiles_ = new double[k_];
+      minDoubleItem_ = Double.NaN;
+      maxDoubleItem_ = Double.NaN;
+      doubleItems_ = new double[k_];
     }
     else if (memValidate.singleItem && !updatableMemFormat) {
       final double item = srcMem.getDouble(DATA_START_ADR_SINGLE_ITEM);
-      minItem_ = maxItem_ = item;
-      quantiles_ = new double[k_];
-      quantiles_[k_ - 1] = item;
+      minDoubleItem_ = maxDoubleItem_ = item;
+      doubleItems_ = new double[k_];
+      doubleItems_[k_ - 1] = item;
     }
     else { //Full or updatableMemFormat
       int offsetBytes = DATA_START_ADR;
       offsetBytes += (updatableMemFormat ? levelsArr.length * Integer.BYTES : (levelsArr.length - 1) * Integer.BYTES);
-      minItem_ = srcMem.getDouble(offsetBytes);
+      minDoubleItem_ = srcMem.getDouble(offsetBytes);
       offsetBytes += Double.BYTES;
-      maxItem_ = srcMem.getDouble(offsetBytes);
+      maxDoubleItem_ = srcMem.getDouble(offsetBytes);
       offsetBytes += Double.BYTES;
       final int capacityItems = levelsArr[getNumLevels()];
       final int retainedItems = capacityItems - levelsArr[0];
-      quantiles_ = new double[capacityItems];
+      doubleItems_ = new double[capacityItems];
       final int shift = levelsArr[0];
       if (updatableMemFormat) {
         offsetBytes += shift * Double.BYTES;
-        srcMem.getDoubleArray(offsetBytes, quantiles_, shift, retainedItems);
+        srcMem.getDoubleArray(offsetBytes, doubleItems_, shift, retainedItems);
       } else {
-        srcMem.getDoubleArray(offsetBytes, quantiles_, shift, retainedItems);
+        srcMem.getDoubleArray(offsetBytes, doubleItems_, shift, retainedItems);
       }
     }
   }
 
   static KllHeapDoublesSketch heapifyImpl(final Memory srcMem) {
     Objects.requireNonNull(srcMem, "Parameter 'srcMem' must not be null");
-    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem);
-    if (!memVal.doublesSketch) { Error.kllSketchThrow(SRC_MUST_BE_DOUBLE); }
+    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem, DOUBLES_SKETCH);
     return new KllHeapDoublesSketch(srcMem, memVal);
   }
 
@@ -134,25 +132,22 @@
   public long getN() { return n_; }
 
   @Override
-  double[] getDoubleItemsArray() { return quantiles_; }
+  double[] getDoubleItemsArray() { return doubleItems_; }
 
   @Override
   double getDoubleSingleItem() {
     if (n_ != 1L) { kllSketchThrow(NOT_SINGLE_ITEM); return Double.NaN; }
-    return quantiles_[k_ - 1];
+    return doubleItems_[k_ - 1];
   }
 
   @Override
-  float getFloatSingleItem() { kllSketchThrow(MUST_NOT_CALL); return Float.NaN; }
-
-  @Override
   int getM() { return m_; }
 
   @Override
-  double getMaxDoubleItem() { return maxItem_; }
+  double getMaxDoubleItem() { return maxDoubleItem_; }
 
   @Override
-  double getMinDoubleItem() { return minItem_; }
+  double getMinDoubleItem() { return minDoubleItem_; }
 
   @Override
   int getMinK() { return minK_; }
@@ -167,19 +162,19 @@
   boolean isLevelZeroSorted() { return isLevelZeroSorted_; }
 
   @Override
-  void setDoubleItemsArray(final double[] doubleItems) { quantiles_ = doubleItems; }
+  void setDoubleItemsArray(final double[] doubleItems) { doubleItems_ = doubleItems; }
 
   @Override
-  void setDoubleItemsArrayAt(final int index, final double item) { quantiles_[index] = item; }
+  void setDoubleItemsArrayAt(final int index, final double item) { doubleItems_[index] = item; }
 
   @Override
   void setLevelZeroSorted(final boolean sorted) { this.isLevelZeroSorted_ = sorted; }
 
   @Override
-  void setMaxDoubleItem(final double item) { maxItem_ = item; }
+  void setMaxDoubleItem(final double item) { maxDoubleItem_ = item; }
 
   @Override
-  void setMinDoubleItem(final double item) { minItem_ = item; }
+  void setMinDoubleItem(final double item) { minDoubleItem_ = item; }
 
   @Override
   void setMinK(final int minK) { minK_ = minK; }
diff --git a/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java b/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java
index f1ebb91..73aefdb 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java
@@ -21,10 +21,9 @@
 
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR_SINGLE_ITEM;
-import static org.apache.datasketches.kll.KllSketch.Error.MUST_NOT_CALL;
 import static org.apache.datasketches.kll.KllSketch.Error.NOT_SINGLE_ITEM;
-import static org.apache.datasketches.kll.KllSketch.Error.SRC_MUST_BE_FLOAT;
 import static org.apache.datasketches.kll.KllSketch.Error.kllSketchThrow;
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 
 import java.util.Objects;
 
@@ -39,9 +38,9 @@
  * @author Lee Rhodes, Kevin Lang
  */
 final class KllHeapFloatsSketch extends KllFloatsSketch {
-  private final int k_;    // configured size of K.
-  private final int m_;    // configured size of M.
-  private long n_;        // number of items input into this sketch.
+  private final int k_; // configured size of K.
+  private final int m_; // configured size of M.
+  private long n_;      // number of items input into this sketch.
   private int minK_;    // dynamic minK for error estimation after merging with different k.
   private boolean isLevelZeroSorted_;
   private float minFloatItem_;
@@ -55,7 +54,7 @@
    * <em>k</em> can be between <em>m</em> and 65535, inclusive.
    * The default <em>k</em> = 200 results in a normalized rank error of about 1.65%.
    * Larger <em>k</em> will have smaller error but the sketch will be larger (and slower).
-   * @param m parameter that controls the minimum level width in items. It can be 2, 4, 6 or 8.
+   * @param m parameter controls the minimum level width in items. It can be 2, 4, 6 or 8.
    * The DEFAULT_M, which is 8 is recommended. Other sizes of <em>m</em> should be considered
    * experimental as they have not been as well characterized.
    */
@@ -77,24 +76,24 @@
   /**
    * Heapify constructor.
    * @param srcMem Memory object that contains data serialized by this sketch.
-   * @param memVal the MemoryValidate object
+   * @param memValidate the MemoryValidate object
    */
-  private KllHeapFloatsSketch(final Memory srcMem, final KllMemoryValidate memVal) {
+  private KllHeapFloatsSketch(final Memory srcMem, final KllMemoryValidate memValidate) {
     super(null, null);
-    k_ = memVal.k;
-    m_ = memVal.m;
-    n_ = memVal.n;
-    minK_ = memVal.minK;
-    levelsArr = memVal.levelsArr;
-    isLevelZeroSorted_ = memVal.level0Sorted;
-    final boolean updatableMemFormat = memVal.updatableMemFormat;
+    k_ = memValidate.k;
+    m_ = memValidate.m;
+    n_ = memValidate.n;
+    minK_ = memValidate.minK;
+    levelsArr = memValidate.levelsArr;
+    isLevelZeroSorted_ = memValidate.level0Sorted;
+    final boolean updatableMemFormat = memValidate.updatableMemFormat;
 
-    if (memVal.empty && !updatableMemFormat) {
+    if (memValidate.empty && !updatableMemFormat) {
       minFloatItem_ = Float.NaN;
       maxFloatItem_ = Float.NaN;
       floatItems_ = new float[k_];
     }
-    else if (memVal.singleItem && !updatableMemFormat) {
+    else if (memValidate.singleItem && !updatableMemFormat) {
       final float item = srcMem.getFloat(DATA_START_ADR_SINGLE_ITEM);
       minFloatItem_ = maxFloatItem_ = item;
       floatItems_ = new float[k_];
@@ -122,8 +121,7 @@
 
   static KllHeapFloatsSketch heapifyImpl(final Memory srcMem) {
     Objects.requireNonNull(srcMem, "Parameter 'srcMem' must not be null");
-    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem);
-    if (memVal.doublesSketch) { Error.kllSketchThrow(SRC_MUST_BE_FLOAT); }
+    final KllMemoryValidate memVal = new KllMemoryValidate(srcMem, FLOATS_SKETCH);
     return new KllHeapFloatsSketch(srcMem, memVal);
   }
 
@@ -134,9 +132,6 @@
   public long getN() { return n_; }
 
   @Override
-  double getDoubleSingleItem() { kllSketchThrow(MUST_NOT_CALL); return Double.NaN; }
-
-  @Override
   float[] getFloatItemsArray() { return floatItems_; }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/kll/KllHelper.java b/src/main/java/org/apache/datasketches/kll/KllHelper.java
index d27760f..1384e11 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHelper.java
@@ -31,19 +31,21 @@
 import static org.apache.datasketches.common.Util.isOdd;
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.DATA_START_ADR_SINGLE_ITEM;
-import static org.apache.datasketches.kll.KllPreambleUtil.DOUBLES_SKETCH_BIT_MASK;
 import static org.apache.datasketches.kll.KllPreambleUtil.EMPTY_BIT_MASK;
+import static org.apache.datasketches.kll.KllPreambleUtil.FAMILY_BYTE_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.FLAGS_BYTE_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.KLL_FAMILY;
 import static org.apache.datasketches.kll.KllPreambleUtil.K_SHORT_ADR;
+import static org.apache.datasketches.kll.KllPreambleUtil.M_BYTE_ADR;
+import static org.apache.datasketches.kll.KllPreambleUtil.PREAMBLE_INTS_BYTE_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.PREAMBLE_INTS_EMPTY_SINGLE;
 import static org.apache.datasketches.kll.KllPreambleUtil.PREAMBLE_INTS_FULL;
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_EMPTY_FULL;
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_SINGLE;
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_UPDATABLE;
+import static org.apache.datasketches.kll.KllPreambleUtil.SER_VER_BYTE_ADR;
 import static org.apache.datasketches.kll.KllPreambleUtil.SINGLE_ITEM_BIT_MASK;
 import static org.apache.datasketches.kll.KllPreambleUtil.UPDATABLE_BIT_MASK;
-import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryDoubleSketchFlag;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryEmptyFlag;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryFamilyID;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryK;
@@ -57,6 +59,7 @@
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemorySingleItemFlag;
 import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryUpdatableFlag;
 import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 
 import java.util.Arrays;
 
@@ -140,6 +143,7 @@
    * @param sketch the current sketch
    */
   static void compressWhileUpdatingSketch(final KllSketch sketch) {
+    final SketchType sketchType = sketch.sketchType;
     final int level =
         findLevelToCompact(sketch.getK(), sketch.getM(), sketch.getNumLevels(), sketch.getLevelsArray());
     if (level == sketch.getNumLevels() - 1) {
@@ -161,8 +165,9 @@
     final int adjPop = oddPop ? rawPop - 1 : rawPop;
     final int halfAdjPop = adjPop / 2;
 
-    if (sketch.sketchType == DOUBLES_SKETCH) {
-      final double[] myDoubleItemsArr = sketch.getDoubleItemsArray();
+    if (sketchType == DOUBLES_SKETCH) {
+      final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+      final double[] myDoubleItemsArr = dblSk.getDoubleItemsArray();
       if (level == 0) { // level zero might not be sorted, so we must sort it if we wish to compact it
         Arrays.sort(myDoubleItemsArr, adjBeg, adjBeg + adjPop);
       }
@@ -177,13 +182,13 @@
       }
 
       int newIndex = myLevelsArr[level + 1] - halfAdjPop;  // adjust boundaries of the level above
-      sketch.setLevelsArrayAt(level + 1, newIndex);
+      dblSk.setLevelsArrayAt(level + 1, newIndex);
 
       if (oddPop) {
-        sketch.setLevelsArrayAt(level, myLevelsArr[level + 1] - 1); // the current level now contains one item
+        dblSk.setLevelsArrayAt(level, myLevelsArr[level + 1] - 1); // the current level now contains one item
         myDoubleItemsArr[myLevelsArr[level]] = myDoubleItemsArr[rawBeg];  // namely this leftover guy
       } else {
-        sketch.setLevelsArrayAt(level, myLevelsArr[level + 1]); // the current level is now empty
+        dblSk.setLevelsArrayAt(level, myLevelsArr[level + 1]); // the current level is now empty
       }
 
       // verify that we freed up halfAdjPop array slots just below the current level
@@ -197,12 +202,13 @@
       }
       for (int lvl = 0; lvl < level; lvl++) {
         newIndex = myLevelsArr[lvl] + halfAdjPop; //adjust boundary
-        sketch.setLevelsArrayAt(lvl, newIndex);
+        dblSk.setLevelsArrayAt(lvl, newIndex);
       }
-      sketch.setDoubleItemsArray(myDoubleItemsArr);
+      dblSk.setDoubleItemsArray(myDoubleItemsArr);
     }
-    else { //Float sketch
-      final float[] myFloatItemsArr = sketch.getFloatItemsArray();
+    else if (sketchType == FLOATS_SKETCH) {
+      final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+      final float[] myFloatItemsArr = fltSk.getFloatItemsArray();
       if (level == 0) { // level zero might not be sorted, so we must sort it if we wish to compact it
         Arrays.sort(myFloatItemsArr, adjBeg, adjBeg + adjPop);
       }
@@ -217,13 +223,13 @@
       }
 
       int newIndex = myLevelsArr[level + 1] - halfAdjPop;  // adjust boundaries of the level above
-      sketch.setLevelsArrayAt(level + 1, newIndex);
+      fltSk.setLevelsArrayAt(level + 1, newIndex);
 
       if (oddPop) {
-        sketch.setLevelsArrayAt(level, myLevelsArr[level + 1] - 1); // the current level now contains one item
+        fltSk.setLevelsArrayAt(level, myLevelsArr[level + 1] - 1); // the current level now contains one item
         myFloatItemsArr[myLevelsArr[level]] = myFloatItemsArr[rawBeg];  // namely this leftover guy
       } else {
-        sketch.setLevelsArrayAt(level, myLevelsArr[level + 1]); // the current level is now empty
+        fltSk.setLevelsArrayAt(level, myLevelsArr[level + 1]); // the current level is now empty
       }
 
       // verify that we freed up halfAdjPop array slots just below the current level
@@ -237,10 +243,11 @@
       }
       for (int lvl = 0; lvl < level; lvl++) {
         newIndex = myLevelsArr[lvl] + halfAdjPop; //adjust boundary
-        sketch.setLevelsArrayAt(lvl, newIndex);
+        fltSk.setLevelsArrayAt(lvl, newIndex);
       }
-      sketch.setFloatItemsArray(myFloatItemsArr);
+      fltSk.setFloatItemsArray(myFloatItemsArr);
     }
+    //TODO add items
   }
 
   /**
@@ -347,11 +354,11 @@
       println("Given N         : " + gStats.givenN);
       printf("%10s %10s %20s %13s %15s\n", "NumLevels", "MaxItems", "MaxN", "CompactBytes", "UpdatableBytes");
     }
-    final int typeBytes = (sketchType == DOUBLES_SKETCH) ? Double.BYTES : Float.BYTES;
+    final int typeBytes = sketchType == DOUBLES_SKETCH ? Double.BYTES : Float.BYTES;
     do {
       gStats.numLevels++; //
       lvlStats = getFinalSketchStatsAtNumLevels(gStats.k, gStats.m, gStats.numLevels, false);
-      gStats.maxItems = lvlStats.numItems; //
+      gStats.maxItems = lvlStats.numItems;
       gStats.maxN = lvlStats.n; //
       gStats.compactBytes =
           gStats.maxItems * typeBytes + gStats.numLevels * Integer.BYTES + 2 * typeBytes + DATA_START_ADR;
@@ -460,8 +467,7 @@
       final int newItemsArrLen) {
     final KllSketch.SketchType sketchType = sketch.sketchType;
     final WritableMemory oldWmem = sketch.wmem;
-    final int typeBytes = (sketchType == DOUBLES_SKETCH) ? Double.BYTES : Float.BYTES;
-
+    final int typeBytes = sketchType == DOUBLES_SKETCH ? Double.BYTES : Float.BYTES;
     final int requiredSketchBytes =  DATA_START_ADR
       + newLevelsArrLen * Integer.BYTES
       + 2 * typeBytes
@@ -479,57 +485,61 @@
     return newWmem;
   }
 
-  static String outputData(final boolean doubleType, final int numLevels, final int[] levelsArr,
-      final float[] floatItemsArr, final double[] doubleItemsArr) {
+  private static String outputDoublesData(final int numLevels, final int[] levelsArr, final double[] doubleItemsArr) {
     final StringBuilder sb =  new StringBuilder();
     sb.append("### KLL items data {index, item}:").append(Util.LS);
     if (levelsArr[0] > 0) {
       sb.append(" Garbage:" + Util.LS);
-      if (doubleType) {
-        for (int i = 0; i < levelsArr[0]; i++) {
-          sb.append("   ").append(i + ", ").append(doubleItemsArr[i]).append(Util.LS);
-        }
-      } else {
-        for (int i = 0; i < levelsArr[0]; i++) {
-          sb.append("   ").append(i + ", ").append(floatItemsArr[i]).append(Util.LS);
-        }
+      for (int i = 0; i < levelsArr[0]; i++) {
+        sb.append("   ").append(i + ", ").append(doubleItemsArr[i]).append(Util.LS);
       }
     }
     int level = 0;
-    if (doubleType) {
-      while (level < numLevels) {
-        final int fromIndex = levelsArr[level];
-        final int toIndex = levelsArr[level + 1]; // exclusive
-        if (fromIndex < toIndex) {
-          sb.append(" level[").append(level).append("]: offset: " + levelsArr[level] + " wt: " + (1 << level));
-          sb.append(Util.LS);
-        }
-
-        for (int i = fromIndex; i < toIndex; i++) {
-          sb.append("   ").append(i + ", ").append(doubleItemsArr[i]).append(Util.LS);
-        }
-        level++;
+    while (level < numLevels) {
+      final int fromIndex = levelsArr[level];
+      final int toIndex = levelsArr[level + 1]; // exclusive
+      if (fromIndex < toIndex) {
+        sb.append(" level[").append(level).append("]: offset: " + levelsArr[level] + " wt: " + (1 << level));
+        sb.append(Util.LS);
       }
-    }
-    else {
-      while (level < numLevels) {
-        final int fromIndex = levelsArr[level];
-        final int toIndex = levelsArr[level + 1]; // exclusive
-        if (fromIndex <= toIndex) {
-          sb.append(" level[").append(level).append("]: offset: " + levelsArr[level] + " wt: " + (1 << level));
-          sb.append(Util.LS);
-        }
 
-        for (int i = fromIndex; i < toIndex; i++) {
-          sb.append("   ").append(i + ", ").append(floatItemsArr[i]).append(Util.LS);
-        }
-        level++;
+      for (int i = fromIndex; i < toIndex; i++) {
+        sb.append("   ").append(i + ", ").append(doubleItemsArr[i]).append(Util.LS);
       }
+      level++;
     }
     sb.append(" level[" + level + "]: offset: " + levelsArr[level] + " (Exclusive)");
     sb.append(Util.LS);
     sb.append("### End items data").append(Util.LS);
+    return sb.toString();
+  }
 
+  private static String outputFloatsData(final int numLevels, final int[] levelsArr, final float[] floatsItemsArr) {
+    final StringBuilder sb =  new StringBuilder();
+    sb.append("### KLL items data {index, item}:").append(Util.LS);
+    if (levelsArr[0] > 0) {
+      sb.append(" Garbage:" + Util.LS);
+      for (int i = 0; i < levelsArr[0]; i++) {
+        sb.append("   ").append(i + ", ").append(floatsItemsArr[i]).append(Util.LS);
+      }
+    }
+    int level = 0;
+    while (level < numLevels) {
+      final int fromIndex = levelsArr[level];
+      final int toIndex = levelsArr[level + 1]; // exclusive
+      if (fromIndex < toIndex) {
+        sb.append(" level[").append(level).append("]: offset: " + levelsArr[level] + " wt: " + (1 << level));
+        sb.append(Util.LS);
+      }
+
+      for (int i = fromIndex; i < toIndex; i++) {
+        sb.append("   ").append(i + ", ").append(floatsItemsArr[i]).append(Util.LS);
+      }
+      level++;
+    }
+    sb.append(" level[" + level + "]: offset: " + levelsArr[level] + " (Exclusive)");
+    sb.append(Util.LS);
+    sb.append("### End items data").append(Util.LS);
     return sb.toString();
   }
 
@@ -562,83 +572,95 @@
   static byte[] toCompactByteArrayImpl(final KllSketch sketch) {
     if (sketch.isEmpty()) { return fastEmptyCompactByteArray(sketch); }
     if (sketch.isSingleItem()) { return fastSingleItemCompactByteArray(sketch); }
+    //n > 1
     final byte[] byteArr = new byte[sketch.getCurrentCompactSerializedSizeBytes()];
     final WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     loadFirst8Bytes(sketch, wmem, false);
-    if (sketch.getN() == 0) { return byteArr; } //empty
-    final boolean doubleType = (sketch.sketchType == DOUBLES_SKETCH);
 
-    //load data
-    int offset = DATA_START_ADR_SINGLE_ITEM;
+    //remainder of preamble after first 8 bytes
+    setMemoryN(wmem, sketch.getN());
+    setMemoryMinK(wmem, sketch.getMinK());
+    setMemoryNumLevels(wmem, sketch.getNumLevels());
+
+    int offset = DATA_START_ADR;
+
+    //LOAD LEVELS ARR: the last integer in levels_ is NOT serialized
     final int[] myLevelsArr = sketch.getLevelsArray();
-    if (sketch.getN() == 1) { //single item
-      if (doubleType) {
-        wmem.putDouble(offset,  sketch.getDoubleItemsArray()[myLevelsArr[0]]);
-      } else {
-        wmem.putFloat(offset, sketch.getFloatItemsArray()[myLevelsArr[0]]);
-      }
-    } else { // n > 1
-      //remainder of preamble after first 8 bytes
-      setMemoryN(wmem, sketch.getN());
-      setMemoryMinK(wmem, sketch.getMinK());
-      setMemoryNumLevels(wmem, sketch.getNumLevels());
-      offset = DATA_START_ADR;
+    final int len = myLevelsArr.length - 1;
+    wmem.putIntArray(offset, myLevelsArr, 0, len);
 
-      //LOAD LEVELS ARR the last integer in levels_ is NOT serialized
-      final int len = myLevelsArr.length - 1;
-      wmem.putIntArray(offset, myLevelsArr, 0, len);
-      offset += len * Integer.BYTES;
+    offset += len * Integer.BYTES;
 
-      //LOAD MIN, MAX Items FOLLOWED BY ITEMS ARRAY
-      if (doubleType) {
-        wmem.putDouble(offset,sketch.getMinDoubleItem());
+    //LOAD MIN, MAX Items FOLLOWED BY ITEMS ARRAY
+    switch (sketch.sketchType) {
+      case DOUBLES_SKETCH : {
+        final KllDoublesSketch dblSk = (KllDoublesSketch)sketch;
+        wmem.putDouble(offset,dblSk.getMinDoubleItem());
         offset += Double.BYTES;
-        wmem.putDouble(offset, sketch.getMaxDoubleItem());
+        wmem.putDouble(offset, dblSk.getMaxDoubleItem());
         offset += Double.BYTES;
-        wmem.putDoubleArray(offset, sketch.getDoubleItemsArray(), myLevelsArr[0], sketch.getNumRetained());
-      } else {
-        wmem.putFloat(offset, sketch.getMinFloatItem());
-        offset += Float.BYTES;
-        wmem.putFloat(offset, sketch.getMaxFloatItem());
-        offset += Float.BYTES;
-        wmem.putFloatArray(offset, sketch.getFloatItemsArray(), myLevelsArr[0], sketch.getNumRetained());
+        wmem.putDoubleArray(offset, dblSk.getDoubleItemsArray(), myLevelsArr[0], sketch.getNumRetained());
+        break;
       }
+      case FLOATS_SKETCH  : {
+        final KllFloatsSketch fltSk = (KllFloatsSketch)sketch;
+        wmem.putFloat(offset, fltSk.getMinFloatItem());
+        offset += Float.BYTES;
+        wmem.putFloat(offset, fltSk.getMaxFloatItem());
+        offset += Float.BYTES;
+        wmem.putFloatArray(offset, fltSk.getFloatItemsArray(), myLevelsArr[0], sketch.getNumRetained());
+        break;
+      }
+      //case ITEMS_SKETCH : break; //TODO
+      default: throw new IllegalStateException("Unknown Sketch Type");
     }
     return byteArr;
   }
 
   static byte[] fastEmptyCompactByteArray(final KllSketch sketch) {
-    final int doubleFlagBit = (sketch.sketchType == DOUBLES_SKETCH) ? DOUBLES_SKETCH_BIT_MASK : 0;
     final byte[] byteArr = new byte[8];
     byteArr[0] = PREAMBLE_INTS_EMPTY_SINGLE; //2
     byteArr[1] = SERIAL_VERSION_EMPTY_FULL;  //1
-    byteArr[2] = KLL_FAMILY; //15
-    byteArr[3] = (byte) (EMPTY_BIT_MASK | doubleFlagBit);
+    byteArr[2] = KLL_FAMILY;                 //15
+    byteArr[3] = (byte) (EMPTY_BIT_MASK);
     ByteArrayUtil.putShortLE(byteArr, K_SHORT_ADR, (short)sketch.getK());
     byteArr[6] = (byte)sketch.getM();
     return byteArr;
   }
 
   static byte[] fastSingleItemCompactByteArray(final KllSketch sketch) {
-    final boolean doubleSketch = sketch.sketchType == DOUBLES_SKETCH;
-    final int doubleFlagBit = doubleSketch ? DOUBLES_SKETCH_BIT_MASK : 0;
-    final byte[] byteArr = new byte[8 + (doubleSketch ? Double.BYTES : Float.BYTES)];
-    byteArr[0] = PREAMBLE_INTS_EMPTY_SINGLE; //2
-    byteArr[1] = SERIAL_VERSION_SINGLE;      //2
-    byteArr[2] = KLL_FAMILY; //15
-    byteArr[3] = (byte) (SINGLE_ITEM_BIT_MASK | doubleFlagBit);
-    ByteArrayUtil.putShortLE(byteArr, K_SHORT_ADR, (short)sketch.getK());
-    byteArr[6] = (byte)sketch.getM();
-    if (doubleSketch) {
-      ByteArrayUtil.putDoubleLE(byteArr, DATA_START_ADR_SINGLE_ITEM, sketch.getDoubleSingleItem());
-    } else {
-      ByteArrayUtil.putFloatLE(byteArr, DATA_START_ADR_SINGLE_ITEM, sketch.getFloatSingleItem());
+    final SketchType sketchType = sketch.sketchType;
+    final byte[] byteArr;
+    switch (sketchType) {
+      case FLOATS_SKETCH: {
+        final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+        byteArr = new byte[8 + Float.BYTES]; //12 bytes total
+        ByteArrayUtil.putFloatLE(byteArr, DATA_START_ADR_SINGLE_ITEM, fltSk.getFloatSingleItem());
+        break;
+      }
+      case DOUBLES_SKETCH: {
+        final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+        byteArr = new byte[8 + Double.BYTES]; //16 bytes total
+        ByteArrayUtil.putDoubleLE(byteArr, DATA_START_ADR_SINGLE_ITEM, dblSk.getDoubleSingleItem());
+        break;
+      }
+//      case ITEMS_SKETCH: {
+//        byteArr = null; //TODO
+//        break;
+//      }
+      default: return null; //can't happen
     }
+    byteArr[PREAMBLE_INTS_BYTE_ADR] = PREAMBLE_INTS_EMPTY_SINGLE; //2
+    byteArr[SER_VER_BYTE_ADR] = SERIAL_VERSION_SINGLE;            //2
+    byteArr[FAMILY_BYTE_ADR] = KLL_FAMILY;                        //15
+    byteArr[FLAGS_BYTE_ADR] = (byte) SINGLE_ITEM_BIT_MASK;        //4
+    ByteArrayUtil.putShortLE(byteArr, K_SHORT_ADR, (short)sketch.getK());
+    byteArr[M_BYTE_ADR] = (byte)sketch.getM();
     return byteArr;
   }
 
   static String toStringImpl(final KllSketch sketch, final boolean withLevels, final boolean withData) {
-    final boolean doubleType = (sketch.sketchType == DOUBLES_SKETCH);
+    final SketchType sketchType = sketch.sketchType;
     final int k = sketch.getK();
     final int m = sketch.getM();
     final int numLevels = sketch.getNumLevels();
@@ -646,7 +668,9 @@
     final String epsPct = String.format("%.3f%%", sketch.getNormalizedRankError(false) * 100);
     final String epsPMFPct = String.format("%.3f%%", sketch.getNormalizedRankError(true) * 100);
     final StringBuilder sb = new StringBuilder();
-    final String skType = (sketch.updatableMemFormat ? "Direct" : "") + (doubleType ? "Doubles" : "Floats");
+    final String directStr = sketch.updatableMemFormat ? "Direct" : "";
+    final String skType = sketchType == DOUBLES_SKETCH ? directStr + "Doubles" :
+      sketchType == FLOATS_SKETCH ? directStr + "Floats" : directStr + "Items";
     sb.append(Util.LS).append("### Kll").append(skType).append("Sketch Summary:").append(Util.LS);
     sb.append("   K                      : ").append(k).append(Util.LS);
     sb.append("   Dynamic min K          : ").append(sketch.getMinK()).append(Util.LS);
@@ -666,27 +690,43 @@
       sb.append("   Compact Storage Bytes  : ").append(sketch.getCurrentCompactSerializedSizeBytes()).append(Util.LS);
     }
 
-    if (doubleType) {
-      sb.append("   Min Item               : ").append(sketch.getMinDoubleItem()).append(Util.LS);
-      sb.append("   Max Item               : ").append(sketch.getMaxDoubleItem()).append(Util.LS);
-    } else {
-      sb.append("   Min Item               : ").append(sketch.getMinFloatItem()).append(Util.LS);
-      sb.append("   Max Item               : ").append(sketch.getMaxFloatItem()).append(Util.LS);
+    if (sketchType == DOUBLES_SKETCH) {
+      final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+      sb.append("   Min Item               : ").append(dblSk.getMinDoubleItem()).append(Util.LS);
+      sb.append("   Max Item               : ").append(dblSk.getMaxDoubleItem()).append(Util.LS);
+    } else if (sketchType == FLOATS_SKETCH) {
+      final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+      sb.append("   Min Item               : ").append(fltSk.getMinFloatItem()).append(Util.LS);
+      sb.append("   Max Item               : ").append(fltSk.getMaxFloatItem()).append(Util.LS);
     }
+//    else {
+//      KllItemsSketch itmSk = (KllItemsSketch) sketch;
+//      sb.append("   Min Item               : ").append(itmSk.getMinItem()).append(Util.LS);
+//      sb.append("   Max Item               : ").append(itmSk.getMaxItem()).append(Util.LS);
+//    }
     sb.append("### End sketch summary").append(Util.LS);
 
     double[] myDoubleItemsArr = null;
     float[] myFloatItemsArr = null;
-    if (doubleType) {
-      myDoubleItemsArr = sketch.getDoubleItemsArray();
-    } else {
-      myFloatItemsArr = sketch.getFloatItemsArray();
-    }
+    //Object[] myItemsArr = null;
+
     if (withLevels) {
       sb.append(outputLevels(k, m, numLevels, levelsArr));
     }
     if (withData) {
-      sb.append(outputData(doubleType, numLevels, levelsArr, myFloatItemsArr, myDoubleItemsArr));
+      if (sketchType == DOUBLES_SKETCH) {
+        final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+        myDoubleItemsArr = dblSk.getDoubleItemsArray();
+        sb.append(outputDoublesData(numLevels, levelsArr, myDoubleItemsArr));
+      } else if (sketchType == FLOATS_SKETCH) {
+        final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+        myFloatItemsArr = fltSk.getFloatItemsArray();
+        sb.append(outputFloatsData(numLevels, levelsArr, myFloatItemsArr));
+      }
+//      else { //Items Sketch //TODO
+//        myItemsArr = null;
+//        sb.append(outputGenericItemsData(numLevels, levelsArr, myItemsArr));
+//      }
     }
     return sb.toString();
   }
@@ -699,13 +739,11 @@
    * @return a byte array in an updatable form.
    */
   private static byte[] toUpdatableByteArrayFromUpdatableMemory(final KllSketch sketch) {
-    final boolean doubleType = (sketch.sketchType == SketchType.DOUBLES_SKETCH);
     final int curBytes = sketch.getCurrentUpdatableSerializedSizeBytes();
     final long n = sketch.getN();
     final byte flags = (byte) (UPDATABLE_BIT_MASK
         | ((n == 0) ? EMPTY_BIT_MASK : 0)
-        | ((n == 1) ? SINGLE_ITEM_BIT_MASK : 0)
-        | (doubleType ? DOUBLES_SKETCH_BIT_MASK : 0));
+        | ((n == 1) ? SINGLE_ITEM_BIT_MASK : 0));
     final byte[] byteArr = new byte[curBytes];
     sketch.wmem.getByteArray(0, byteArr, 0, curBytes);
     byteArr[FLAGS_BYTE_ADR] = flags;
@@ -732,7 +770,7 @@
     setMemoryNumLevels(wmem, sketch.getNumLevels());
 
     //load data
-    final boolean doubleType = (sketch.sketchType == DOUBLES_SKETCH);
+    final SketchType sketchType = sketch.sketchType;
     int offset = DATA_START_ADR;
 
     //LOAD LEVELS ARRAY the last integer in levels_ IS serialized
@@ -742,21 +780,26 @@
     offset += len * Integer.BYTES;
 
     //LOAD MIN, MAX Items FOLLOWED BY ITEMS ARRAY
-    if (doubleType) {
-      wmem.putDouble(offset, sketch.getMinDoubleItem());
+    if (sketchType == DOUBLES_SKETCH) {
+      final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+      wmem.putDouble(offset, dblSk.getMinDoubleItem());
       offset += Double.BYTES;
-      wmem.putDouble(offset, sketch.getMaxDoubleItem());
+      wmem.putDouble(offset, dblSk.getMaxDoubleItem());
       offset += Double.BYTES;
-      final double[] doubleItemsArr = sketch.getDoubleItemsArray();
+      final double[] doubleItemsArr = dblSk.getDoubleItemsArray();
       wmem.putDoubleArray(offset, doubleItemsArr, 0, doubleItemsArr.length);
-    } else {
-      wmem.putFloat(offset, sketch.getMinFloatItem());
+    } else if (sketchType == FLOATS_SKETCH) {
+      final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+      wmem.putFloat(offset, fltSk.getMinFloatItem());
       offset += Float.BYTES;
-      wmem.putFloat(offset,sketch.getMaxFloatItem());
+      wmem.putFloat(offset,fltSk.getMaxFloatItem());
       offset += Float.BYTES;
-      final float[] floatItemsArr = sketch.getFloatItemsArray();
+      final float[] floatItemsArr = fltSk.getFloatItemsArray();
       wmem.putFloatArray(offset, floatItemsArr, 0, floatItemsArr.length);
     }
+//    else {
+//      //ITEMS_SKETCH //TODO
+//    }
     return byteArr;
   }
 
@@ -775,6 +818,7 @@
    * @param sketch the current sketch
    */
   private static void addEmptyTopLevelToCompletelyFullSketch(final KllSketch sketch) {
+    final SketchType sketchType = sketch.sketchType;
     final int[] myCurLevelsArr = sketch.getLevelsArray();
     final int myCurNumLevels = sketch.getNumLevels();
     final int myCurTotalItemsCapacity = myCurLevelsArr[myCurNumLevels];
@@ -793,18 +837,23 @@
     float[] myNewFloatItemsArr = null;
     double[] myNewDoubleItemsArr = null;
 
-    if (sketch.sketchType == DOUBLES_SKETCH) {
-      minDouble = sketch.getMinDoubleItem();
-      maxDouble = sketch.getMaxDoubleItem();
-      myCurDoubleItemsArr = sketch.getDoubleItemsArray();
+    if (sketchType == DOUBLES_SKETCH) {
+      final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+      minDouble = dblSk.getMinDoubleItem();
+      maxDouble = dblSk.getMaxDoubleItem();
+      myCurDoubleItemsArr = dblSk.getDoubleItemsArray();
       //assert we are following a certain growth scheme
       assert myCurDoubleItemsArr.length == myCurTotalItemsCapacity;
-    } else { //FLOATS_SKETCH
-      minFloat = sketch.getMinFloatItem();
-      maxFloat = sketch.getMaxFloatItem();
-      myCurFloatItemsArr = sketch.getFloatItemsArray();
+    } else if (sketchType == FLOATS_SKETCH) {
+      final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+      minFloat = fltSk.getMinFloatItem();
+      maxFloat = fltSk.getMaxFloatItem();
+      myCurFloatItemsArr = fltSk.getFloatItemsArray();
       assert myCurFloatItemsArr.length == myCurTotalItemsCapacity;
     }
+//    else {
+//      //ITEMS_SKETCH //TODO
+//    }
     assert myCurLevelsArr[0] == 0; //definition of full is part of the growth scheme
 
     final int deltaItemsCap = levelCapacity(sketch.getK(), myCurNumLevels + 1, 0, sketch.getM());
@@ -832,15 +881,18 @@
     myNewLevelsArr[myNewNumLevels] = myNewTotalItemsCapacity; // initialize the new "extra" index at the top
 
     // GROW ITEMS ARRAY
-    if (sketch.sketchType == DOUBLES_SKETCH) {
+    if (sketchType == DOUBLES_SKETCH) {
       myNewDoubleItemsArr = new double[myNewTotalItemsCapacity];
       // copy and shift the current data into the new array
       System.arraycopy(myCurDoubleItemsArr, 0, myNewDoubleItemsArr, deltaItemsCap, myCurTotalItemsCapacity);
-    } else {
+    } else if (sketchType == FLOATS_SKETCH) {
       myNewFloatItemsArr = new float[myNewTotalItemsCapacity];
       // copy and shift the current items data into the new array
       System.arraycopy(myCurFloatItemsArr, 0, myNewFloatItemsArr, deltaItemsCap, myCurTotalItemsCapacity);
     }
+//    else {
+//      //ITEMS_SKETCH // TODO
+//    }
 
     //MEMORY SPACE MANAGEMENT
     if (sketch.updatableMemFormat) {
@@ -849,14 +901,16 @@
     //update our sketch with new expanded spaces
     sketch.setNumLevels(myNewNumLevels);
     sketch.setLevelsArray(myNewLevelsArr);
-    if (sketch.sketchType == DOUBLES_SKETCH) {
-      sketch.setMinDoubleItem(minDouble);
-      sketch.setMaxDoubleItem(maxDouble);
-      sketch.setDoubleItemsArray(myNewDoubleItemsArr);
+    if (sketchType == DOUBLES_SKETCH) {
+      final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
+      dblSk.setMinDoubleItem(minDouble);
+      dblSk.setMaxDoubleItem(maxDouble);
+      dblSk.setDoubleItemsArray(myNewDoubleItemsArr);
     } else { //Float sketch
-      sketch.setMinFloatItem(minFloat);
-      sketch.setMaxFloatItem(maxFloat);
-      sketch.setFloatItemsArray(myNewFloatItemsArr);
+      final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
+      fltSk.setMinFloatItem(minFloat);
+      fltSk.setMaxFloatItem(maxFloat);
+      fltSk.setFloatItemsArray(myNewFloatItemsArr);
     }
   }
 
@@ -916,7 +970,6 @@
     final boolean empty = sk.getN() == 0;
     final boolean lvlZeroSorted = sk.isLevelZeroSorted();
     final boolean singleItem = sk.getN() == 1;
-    final boolean doubleType = (sk.sketchType == DOUBLES_SKETCH);
     final int preInts = updatableFormat
         ? PREAMBLE_INTS_FULL
         : (empty || singleItem) ? PREAMBLE_INTS_EMPTY_SINGLE : PREAMBLE_INTS_FULL;
@@ -929,7 +982,6 @@
     setMemoryEmptyFlag(wmem, empty);
     setMemoryLevelZeroSortedFlag(wmem, lvlZeroSorted);
     setMemorySingleItemFlag(wmem, singleItem);
-    setMemoryDoubleSketchFlag(wmem, doubleType);
     setMemoryUpdatableFlag(wmem, updatableFormat);
     setMemoryK(wmem, sk.getK());
     setMemoryM(wmem, sk.getM());
diff --git a/src/main/java/org/apache/datasketches/kll/KllMemoryValidate.java b/src/main/java/org/apache/datasketches/kll/KllMemoryValidate.java
index cd571ae..acfebf0 100644
--- a/src/main/java/org/apache/datasketches/kll/KllMemoryValidate.java
+++ b/src/main/java/org/apache/datasketches/kll/KllMemoryValidate.java
@@ -36,7 +36,6 @@
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_EMPTY_FULL;
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_SINGLE;
 import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_UPDATABLE;
-import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryDoubleSketchFlag;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryEmptyFlag;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryFamilyID;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryFlags;
@@ -50,15 +49,17 @@
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemorySerVer;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemorySingleItemFlag;
 import static org.apache.datasketches.kll.KllPreambleUtil.getMemoryUpdatableFormatFlag;
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 
 import org.apache.datasketches.common.Family;
 import org.apache.datasketches.common.SketchesArgumentException;
+import org.apache.datasketches.kll.KllSketch.SketchType;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.WritableMemory;
 
 /**
  * This class performs all the error checking of an incoming Memory object and extracts the key fields in the process.
- * This is used by all sketches that read or import Memory objects.
+ * This is used by all KLL sketches that read or import Memory objects.
  *
  * @author lrhodes
  *
@@ -73,7 +74,7 @@
   boolean empty;
   boolean singleItem;
   final boolean level0Sorted;
-  final boolean doublesSketch;
+  final SketchType sketchType;
   boolean updatableMemFormat = false;
   final boolean readOnly;
   final int k;
@@ -90,7 +91,8 @@
   int sketchBytes;
   int[] levelsArr; //adjusted to include top index
 
-  KllMemoryValidate(final Memory srcMem) {
+  KllMemoryValidate(final Memory srcMem, final SketchType sketchType) {
+    
     readOnly = srcMem.isReadOnly();
     preInts = getMemoryPreInts(srcMem);
     serVer = getMemorySerVer(srcMem);
@@ -103,13 +105,13 @@
     empty = getMemoryEmptyFlag(srcMem);
     singleItem = getMemorySingleItemFlag(srcMem);
     level0Sorted  = getMemoryLevelZeroSortedFlag(srcMem);
-    doublesSketch = getMemoryDoubleSketchFlag(srcMem);
+    this.sketchType = sketchType;
     k = getMemoryK(srcMem);
     m = getMemoryM(srcMem);
     KllHelper.checkM(m);
     KllHelper.checkK(k, m);
     if ((serVer == SERIAL_VERSION_UPDATABLE) ^ updatableMemFormat) { memoryValidateThrow(UPDATABLEBIT_AND_SER_VER, 1); }
-    typeBytes = doublesSketch ? Double.BYTES : Float.BYTES;
+    typeBytes = (sketchType == DOUBLES_SKETCH) ? Double.BYTES : Float.BYTES;
 
     if (updatableMemFormat) { updatableMemFormatValidate((WritableMemory) srcMem); }
     else { compactMemoryValidate(srcMem); }
diff --git a/src/main/java/org/apache/datasketches/kll/KllPreambleUtil.java b/src/main/java/org/apache/datasketches/kll/KllPreambleUtil.java
index 6bfe4d9..5a3cf6e 100644
--- a/src/main/java/org/apache/datasketches/kll/KllPreambleUtil.java
+++ b/src/main/java/org/apache/datasketches/kll/KllPreambleUtil.java
@@ -20,8 +20,10 @@
 package org.apache.datasketches.kll;
 
 import static org.apache.datasketches.common.Util.zeroPad;
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 
 import org.apache.datasketches.common.Util;
+import org.apache.datasketches.kll.KllSketch.SketchType;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.WritableMemory;
 
@@ -157,7 +159,6 @@
   static final int EMPTY_BIT_MASK             = 1;
   static final int LEVEL_ZERO_SORTED_BIT_MASK = 2;
   static final int SINGLE_ITEM_BIT_MASK       = 4;
-  static final int DOUBLES_SKETCH_BIT_MASK    = 8;
   static final int UPDATABLE_BIT_MASK         = 16;
 
   /**
@@ -168,9 +169,9 @@
    * @param includeData if true, includes detail of retained data.
    * @return the summary string.
    */
-  static String toString(final byte[] byteArr, final boolean includeData) {
+  static String toString(final byte[] byteArr, final SketchType sketchType, final boolean includeData) {
     final Memory mem = Memory.wrap(byteArr);
-    return toString(mem, includeData);
+    return toString(mem, sketchType, includeData);
   }
 
   /**
@@ -181,13 +182,13 @@
    * @param includeData if true, includes detail of retained data.
    * @return the summary string.
    */
-  static String toString(final Memory mem, final boolean includeData) {
-    final KllMemoryValidate memVal = new KllMemoryValidate(mem);
+  static String toString(final Memory mem, final SketchType sketchType, final boolean includeData) {
+    final KllMemoryValidate memVal = new KllMemoryValidate(mem, sketchType);
     final int flags = memVal.flags & 0XFF;
     final String flagsStr = (flags) + ", 0x" + (Integer.toHexString(flags)) + ", "
         + zeroPad(Integer.toBinaryString(flags), 8);
     final int preInts = memVal.preInts;
-    final boolean doublesSketch = memVal.doublesSketch;
+    final boolean doublesSketch = memVal.sketchType == DOUBLES_SKETCH;
     final boolean updatableMemFormat = memVal.updatableMemFormat;
     final boolean empty = memVal.empty;
     final boolean singleItem = memVal.singleItem;
@@ -342,10 +343,6 @@
     return (getMemoryFlags(mem) & SINGLE_ITEM_BIT_MASK) != 0;
   }
 
-  static boolean getMemoryDoubleSketchFlag(final Memory mem) {
-    return (getMemoryFlags(mem) & DOUBLES_SKETCH_BIT_MASK) != 0;
-  }
-
   static boolean getMemoryUpdatableFormatFlag(final Memory mem) {
     return (getMemoryFlags(mem) & UPDATABLE_BIT_MASK) != 0;
   }
@@ -401,11 +398,6 @@
     setMemoryFlags(wmem, singleItem ? flags | SINGLE_ITEM_BIT_MASK : flags & ~SINGLE_ITEM_BIT_MASK);
   }
 
-  static void setMemoryDoubleSketchFlag(final WritableMemory wmem,  final boolean doubleSketch) {
-    final int flags = getMemoryFlags(wmem);
-    setMemoryFlags(wmem, doubleSketch ? flags | DOUBLES_SKETCH_BIT_MASK : flags & ~DOUBLES_SKETCH_BIT_MASK);
-  }
-
   static void setMemoryUpdatableFlag(final WritableMemory wmem,  final boolean updatable) {
     final int flags = getMemoryFlags(wmem);
     setMemoryFlags(wmem, updatable ? flags | UPDATABLE_BIT_MASK : flags & ~UPDATABLE_BIT_MASK);
diff --git a/src/main/java/org/apache/datasketches/kll/KllSketch.java b/src/main/java/org/apache/datasketches/kll/KllSketch.java
index 32e17a6..700416c 100644
--- a/src/main/java/org/apache/datasketches/kll/KllSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllSketch.java
@@ -88,8 +88,6 @@
     TGT_IS_READ_ONLY("Given sketch Memory is immutable, cannot write."),
     SRC_MUST_BE_DOUBLE("Given sketch must be of type Double."),
     SRC_MUST_BE_FLOAT("Given sketch must be of type Float."),
-    MUST_NOT_CALL("This is an artifact of inheritance and should never be called."),
-    SINGLE_ITEM_IMPROPER_CALL("Improper method use for single-item sketch"),
     MRS_MUST_NOT_BE_NULL("MemoryRequestServer cannot be null."),
     NOT_SINGLE_ITEM("Sketch is not single item."),
     MUST_NOT_BE_UPDATABLE_FORMAT("Given Memory object must not be in updatableFormat.");
@@ -227,7 +225,7 @@
    * @return the current number of bytes this sketch would require to store in the compact Memory Format.
    * @deprecated version 4.0.0 use {@link #getSerializedSizeBytes}.
    */
-  @Deprecated
+  @Deprecated //just make this package private
   public final int getCurrentCompactSerializedSizeBytes() {
     return getCurrentSerializedSizeBytes(getNumLevels(), getNumRetained(), sketchType, false);
   }
@@ -237,7 +235,7 @@
    * @return the current number of bytes this sketch would require to store in the updatable Memory Format.
    * @deprecated version 4.0.0 use {@link #getSerializedSizeBytes}.
    */
-  @Deprecated
+  @Deprecated //just make this package private
   public final int getCurrentUpdatableSerializedSizeBytes() {
     final int quantilesCap = KllHelper.computeTotalItemCapacity(getK(), getM(), getNumLevels());
     return getCurrentSerializedSizeBytes(getNumLevels(), quantilesCap, sketchType, true);
@@ -342,34 +340,11 @@
     if (sketchType == DOUBLES_SKETCH) {
       if (!other.isDoublesSketch()) { kllSketchThrow(SRC_MUST_BE_DOUBLE); }
       KllDoublesHelper.mergeDoubleImpl((KllDoublesSketch)this, other);
-    } else {
+    } else if (sketchType == FLOATS_SKETCH) {
       if (!other.isFloatsSketch()) { kllSketchThrow(SRC_MUST_BE_FLOAT); }
       KllFloatsHelper.mergeFloatImpl((KllFloatsSketch)this, other);
     }
-  }
-
-  /**
-   * {@inheritDoc}
-   * <p>The parameter <i>k</i> will not change.</p>
-   */
-  @Override
-  public final void reset() {
-    if (readOnly) { kllSketchThrow(TGT_IS_READ_ONLY); }
-    final int k = getK();
-    setN(0);
-    setMinK(k);
-    setNumLevels(1);
-    setLevelZeroSorted(false);
-    setLevelsArray(new int[] {k, k});
-    if (sketchType == DOUBLES_SKETCH) {
-      setMinDoubleItem(Double.NaN);
-      setMaxDoubleItem(Double.NaN);
-      setDoubleItemsArray(new double[k]);
-    } else {
-      setMinFloatItem(Float.NaN);
-      setMaxFloatItem(Float.NaN);
-      setFloatItemsArray(new float[k]);
-    }
+    //TODO items
   }
 
   @Override
@@ -387,20 +362,6 @@
     return KllHelper.toStringImpl(this, withLevels, withData);
   }
 
-  /**
-   * @return full size of internal items array including garbage.
-   */
-  abstract double[] getDoubleItemsArray();
-
-  abstract double getDoubleSingleItem();
-
-  /**
-   * @return full size of internal items array including garbage.
-   */
-  abstract float[] getFloatItemsArray();
-
-  abstract float getFloatSingleItem();
-
   final int[] getLevelsArray() {
     return levelsArr;
   }
@@ -414,14 +375,6 @@
    */
   abstract int getM();
 
-  abstract double getMaxDoubleItem();
-
-  abstract float getMaxFloatItem();
-
-  abstract double getMinDoubleItem();
-
-  abstract float getMinFloatItem();
-
   /**
    * MinK is the K that results from a merge with a sketch configured with a K lower than
    * the K of this sketch. This is then used in computing the estimated upper and lower bounds of error.
@@ -453,14 +406,6 @@
    */
   boolean isSingleItem() { return getN() == 1; }
 
-  abstract void setDoubleItemsArray(double[] doubleItems);
-
-  abstract void setDoubleItemsArrayAt(int index, double item);
-
-  abstract void setFloatItemsArray(float[] floatItems);
-
-  abstract void setFloatItemsArrayAt(int index, float item);
-
   final void setLevelsArray(final int[] levelsArr) {
     if (readOnly) { kllSketchThrow(TGT_IS_READ_ONLY); }
     this.levelsArr = levelsArr;
@@ -480,14 +425,6 @@
 
   abstract void setLevelZeroSorted(boolean sorted);
 
-  abstract void setMaxDoubleItem(double item);
-
-  abstract void setMaxFloatItem(float item);
-
-  abstract void setMinDoubleItem(double item);
-
-  abstract void setMinFloatItem(float item);
-
   abstract void setMinK(int minK);
 
   abstract void setN(long n);
diff --git a/src/main/java/org/apache/datasketches/quantiles/ItemsUnion.java b/src/main/java/org/apache/datasketches/quantiles/ItemsUnion.java
index d90ba23..ed0a006 100644
--- a/src/main/java/org/apache/datasketches/quantiles/ItemsUnion.java
+++ b/src/main/java/org/apache/datasketches/quantiles/ItemsUnion.java
@@ -137,7 +137,7 @@
    * @param srcMem Memory image of sketch to be merged
    * @param serDe an instance of ArrayOfItemsSerDe
    */
-  public void union(final Memory srcMem, final ArrayOfItemsSerDe<T> serDe) { //TODO rename merge
+  public void union(final Memory srcMem, final ArrayOfItemsSerDe<T> serDe) {
     final ItemsSketch<T> that = ItemsSketch.getInstance(this.clazz_, srcMem, comparator_, serDe);
     gadget_ = updateLogic(maxK_, comparator_, gadget_, that);
   }
diff --git a/src/main/java/org/apache/datasketches/quantiles/ItemsUtil.java b/src/main/java/org/apache/datasketches/quantiles/ItemsUtil.java
index 1e1f670..782c467 100644
--- a/src/main/java/org/apache/datasketches/quantiles/ItemsUtil.java
+++ b/src/main/java/org/apache/datasketches/quantiles/ItemsUtil.java
@@ -29,10 +29,6 @@
 /**
  * Utility class for generic quantiles sketch.
  *
- * <p>This class contains a highly specialized sort called blockyTandemMergeSort().
- * It also contains methods that are used while building histograms and other common
- * functions.</p>
- *
  * @author Kevin Lang
  * @author Alexander Saydakov
  */
diff --git a/src/main/java/org/apache/datasketches/quantiles/KolmogorovSmirnov.java b/src/main/java/org/apache/datasketches/quantiles/KolmogorovSmirnov.java
index ef2b900..c290b05 100644
--- a/src/main/java/org/apache/datasketches/quantiles/KolmogorovSmirnov.java
+++ b/src/main/java/org/apache/datasketches/quantiles/KolmogorovSmirnov.java
@@ -25,7 +25,7 @@
  */
 final class KolmogorovSmirnov {
 
-  //TODO This KS test will have to be redesigned to accomodate REQ sketches.
+  //TODO This KS test will have to be redesigned to accommodate REQ sketches.
 
   /**
    * Computes the raw delta area between two quantile sketches for the
diff --git a/src/main/java/org/apache/datasketches/theta/PreambleUtil.java b/src/main/java/org/apache/datasketches/theta/PreambleUtil.java
index 2a6c979..562be98 100644
--- a/src/main/java/org/apache/datasketches/theta/PreambleUtil.java
+++ b/src/main/java/org/apache/datasketches/theta/PreambleUtil.java
@@ -477,7 +477,6 @@
     wmem.putLong(UNION_THETA_LONG, unionThetaLong);
   }
 
-  //TODO convert these to set/clear/any bits
   static void setEmpty(final WritableMemory wmem) {
     int flags = wmem.getByte(FLAGS_BYTE) & 0XFF;
     flags |= EMPTY_FLAG_MASK;
diff --git a/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java b/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java
index 2c56b24..cd1e0cb 100644
--- a/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java
+++ b/src/test/java/org/apache/datasketches/hll/PreambleUtilTest.java
@@ -31,18 +31,18 @@
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import org.testng.annotations.Test;
 import org.apache.datasketches.common.SketchesArgumentException;
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.WritableMemory;
+import org.testng.annotations.Test;
 
 /**
  * @author Lee Rhodes
  */
 public class PreambleUtilTest {
 
-  @Test
-  public void preambleToString() { //TODO Check Visually
+  //@Test
+  public void preambleToString() { // Check Visually
     int bytes = HllSketch.getMaxUpdatableSerializationBytes(8, TgtHllType.HLL_4);
     byte[] byteArr1 = new byte[bytes];
     WritableMemory wmem1 = WritableMemory.writableWrap(byteArr1);
diff --git a/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java
index c2c7b14..dfa5932 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.kll;
 
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 import static org.apache.datasketches.quantilescommon.QuantileSearchCriteria.EXCLUSIVE;
 import static org.apache.datasketches.quantilescommon.QuantileSearchCriteria.INCLUSIVE;
 import static org.testng.Assert.assertEquals;
@@ -351,8 +352,8 @@
     assertEquals(sketch2.getNumRetained(), 1);
     assertEquals(sketch2.getN(), 1);
     assertEquals(sketch2.getNormalizedRankError(false), sketch1.getNormalizedRankError(false));
-    assertFalse(Double.isNaN(sketch2.getMinItem()));
-    assertFalse(Double.isNaN(sketch2.getMaxItem()));
+    assertTrue(Double.isFinite(sketch2.getMinItem()));
+    assertTrue(Double.isFinite(sketch2.getMaxItem()));
     assertEquals(sketch2.getCurrentCompactSerializedSizeBytes(), 8 + Double.BYTES);
   }
 
@@ -368,8 +369,8 @@
     assertEquals(sketch2.getNumRetained(), 1);
     assertEquals(sketch2.getN(), 1);
     assertEquals(sketch2.getNormalizedRankError(false), sketch1.getNormalizedRankError(false));
-    assertFalse(Double.isNaN(sketch2.getMinItem()));
-    assertFalse(Double.isNaN(sketch2.getMaxItem()));
+    assertTrue(Double.isFinite(sketch2.getMinItem()));
+    assertTrue(Double.isFinite(sketch2.getMaxItem()));
     assertEquals(sketch2.getCurrentCompactSerializedSizeBytes(), 8 + Double.BYTES);
   }
 
@@ -481,7 +482,7 @@
     //println(sk2.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(compBytes, true));
+    println(KllPreambleUtil.toString(compBytes, DOUBLES_SKETCH, true));
     sk = KllDoublesSketch.writableWrap(wmem, memReqSvr);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), k + 1);
@@ -501,7 +502,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(compBytes, true));
+    println(KllPreambleUtil.toString(compBytes, DOUBLES_SKETCH, true));
     sk = KllDoublesSketch.writableWrap(wmem, memReqSvr);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 0);
@@ -522,7 +523,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(compBytes, true));
+    println(KllPreambleUtil.toString(compBytes, DOUBLES_SKETCH, true));
     sk = KllDoublesSketch.writableWrap(wmem, memReqSvr);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 1);
@@ -643,7 +644,6 @@
     try { sk2.setMinK(idx);                      fail(); } catch (SketchesArgumentException e) { }
     try { sk2.setN(idx);                         fail(); } catch (SketchesArgumentException e) { }
     try { sk2.setNumLevels(idx);                 fail(); } catch (SketchesArgumentException e) { }
-    try { sk2.getFloatSingleItem();             fail(); } catch (SketchesArgumentException e) { }
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
diff --git a/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java
index 875595d..7d78b20 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.kll;
 
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 import static org.apache.datasketches.quantilescommon.QuantileSearchCriteria.EXCLUSIVE;
 import static org.apache.datasketches.quantilescommon.QuantileSearchCriteria.INCLUSIVE;
 import static org.testng.Assert.assertEquals;
@@ -352,7 +353,6 @@
     assertEquals(sketch2.getN(), 1);
     assertEquals(sketch2.getNormalizedRankError(false), sketch1.getNormalizedRankError(false));
     assertTrue(Float.isFinite(sketch2.getMinItem()));
-    assertTrue(Float.isFinite(sketch2.getMinItem()));
     assertTrue(Float.isFinite(sketch2.getMaxItem()));
     assertEquals(sketch2.getCurrentCompactSerializedSizeBytes(), 8 + Float.BYTES);
   }
@@ -482,7 +482,7 @@
     //println(sk2.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(compBytes, true));
+    println(KllPreambleUtil.toString(compBytes, FLOATS_SKETCH, true));
     sk = KllFloatsSketch.writableWrap(wmem, memReqSvr);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), k + 1);
@@ -502,7 +502,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(compBytes, true));
+    println(KllPreambleUtil.toString(compBytes, FLOATS_SKETCH, true));
     sk = KllFloatsSketch.writableWrap(wmem, memReqSvr);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 0);
@@ -523,7 +523,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(compBytes, true));
+    println(KllPreambleUtil.toString(compBytes, FLOATS_SKETCH, true));
     sk = KllFloatsSketch.writableWrap(wmem, memReqSvr);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 1);
@@ -644,7 +644,6 @@
     try { sk2.setMinK(idx);                    fail(); } catch (SketchesArgumentException e) { }
     try { sk2.setN(idx);                       fail(); } catch (SketchesArgumentException e) { }
     try { sk2.setNumLevels(idx);               fail(); } catch (SketchesArgumentException e) { }
-    try { sk2.getDoubleSingleItem();           fail(); } catch (SketchesArgumentException e) { }
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -663,6 +662,7 @@
     try { sk2.merge(sk1); fail(); } catch (SketchesArgumentException e) { }
   }
 
+  // get Direct Floats Sketch
   private static KllFloatsSketch getDFSketch(final int k, final int n) {
     KllFloatsSketch sk = KllFloatsSketch.newHeapInstance(k);
     for (int i = 1; i <= n; i++) { sk.update(i); }
diff --git a/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
index 6777b93..e6d1edc 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
@@ -415,7 +415,7 @@
     sketch1.update(1);
     final byte[] bytes = sketch1.toByteArray();
     final KllDoublesSketch sketch2 = KllDoublesSketch.heapify(Memory.wrap(bytes));
-    assertEquals(bytes.length, sketch1.getCurrentCompactSerializedSizeBytes());
+    assertEquals(bytes.length, sketch1.getSerializedSizeBytes());
     assertFalse(sketch2.isEmpty());
     assertEquals(sketch2.getNumRetained(), 1);
     assertEquals(sketch2.getN(), 1);
@@ -501,21 +501,6 @@
   }
 
   @Test
-  public void coverInheritanceArtifacts() {
-    float[] fltArr = new float[0];
-    float fltV = 1.0f;
-    int idx = 1;
-    KllDoublesSketch sk = KllDoublesSketch.newHeapInstance(20);
-    try { sk.getFloatItemsArray();           fail(); } catch (SketchesArgumentException e) { }
-    try { sk.getMaxFloatItem();              fail(); } catch (SketchesArgumentException e) { }
-    try { sk.getMinFloatItem();              fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setFloatItemsArray(fltArr);     fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setFloatItemsArrayAt(idx,fltV); fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setMaxFloatItem(fltV);          fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setMinFloatItem(fltV);          fail(); } catch (SketchesArgumentException e) { }
-  }
-
-  @Test
   public void checkReadOnlyUpdate() {
     KllDoublesSketch sk1 = KllDoublesSketch.newHeapInstance(20);
     Memory mem = Memory.wrap(sk1.toByteArray());
diff --git a/src/test/java/org/apache/datasketches/kll/KllFloatsSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllFloatsSketchTest.java
index 51cbcf1..c6ef946 100644
--- a/src/test/java/org/apache/datasketches/kll/KllFloatsSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllFloatsSketchTest.java
@@ -502,21 +502,6 @@
   }
 
   @Test
-  public void coverInheritanceArtifacts() {
-    double[] dblArr = new double[0];
-    double dblV = 1.0;
-    int idx = 1;
-    KllFloatsSketch sk = KllFloatsSketch.newHeapInstance(20);
-    try { sk.getDoubleItemsArray();           fail(); } catch (SketchesArgumentException e) { }
-    try { sk.getMaxDoubleItem();             fail(); } catch (SketchesArgumentException e) { }
-    try { sk.getMinDoubleItem();             fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setDoubleItemsArray(dblArr);     fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setDoubleItemsArrayAt(idx,dblV); fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setMaxDoubleItem(dblV);         fail(); } catch (SketchesArgumentException e) { }
-    try { sk.setMinDoubleItem(dblV);         fail(); } catch (SketchesArgumentException e) { }
-  }
-
-  @Test
   public void checkReadOnlyUpdate() {
     KllFloatsSketch sk1 = KllFloatsSketch.newHeapInstance(20);
     Memory mem = Memory.wrap(sk1.toByteArray());
diff --git a/src/test/java/org/apache/datasketches/kll/KllHelperTest.java b/src/test/java/org/apache/datasketches/kll/KllHelperTest.java
index a68bad4..7d6ff81 100644
--- a/src/test/java/org/apache/datasketches/kll/KllHelperTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllHelperTest.java
@@ -26,21 +26,12 @@
 import static org.testng.Assert.fail;
 
 import org.apache.datasketches.common.SketchesArgumentException;
-import org.apache.datasketches.kll.KllSketch.SketchType;
 import org.apache.datasketches.memory.Memory;
 import org.testng.annotations.Test;
 
 @SuppressWarnings("unused")
 public class KllHelperTest {
 
-  /**
-   * Println Object o
-   * @param o object to print
-   */
-  static void println(Object o) {
-    //System.out.println(o.toString());
-  }
-
   @Test
   public void checkCheckM() {
     try {
@@ -195,6 +186,14 @@
         KllHelper.getGrowthSchemeForGivenN(k, KllSketch.DEFAULT_M, n, DOUBLES_SKETCH, true);
     assertEquals(gStats.numLevels, 2);
     assertEquals(gStats.maxItems, 333);
-
   }
+
+  /**
+   * Println Object o
+   * @param o object to print
+   */
+  static void println(Object o) {
+    //System.out.println(o.toString());
+  }
+
 }
diff --git a/src/test/java/org/apache/datasketches/kll/KllMemoryValidateTest.java b/src/test/java/org/apache/datasketches/kll/KllMemoryValidateTest.java
index e0af8f3..5c23731 100644
--- a/src/test/java/org/apache/datasketches/kll/KllMemoryValidateTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllMemoryValidateTest.java
@@ -19,7 +19,18 @@
 
 package org.apache.datasketches.kll;
 
-import static org.apache.datasketches.kll.KllPreambleUtil.*;
+import static org.apache.datasketches.kll.KllPreambleUtil.EMPTY_BIT_MASK;
+import static org.apache.datasketches.kll.KllPreambleUtil.PREAMBLE_INTS_EMPTY_SINGLE;
+import static org.apache.datasketches.kll.KllPreambleUtil.PREAMBLE_INTS_FULL;
+import static org.apache.datasketches.kll.KllPreambleUtil.SERIAL_VERSION_EMPTY_FULL;
+import static org.apache.datasketches.kll.KllPreambleUtil.SINGLE_ITEM_BIT_MASK;
+import static org.apache.datasketches.kll.KllPreambleUtil.UPDATABLE_BIT_MASK;
+import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryFamilyID;
+import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryFlags;
+import static org.apache.datasketches.kll.KllPreambleUtil.setMemoryPreInts;
+import static org.apache.datasketches.kll.KllPreambleUtil.setMemorySerVer;
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 
 import org.apache.datasketches.common.Family;
 import org.apache.datasketches.common.SketchesArgumentException;
@@ -35,7 +46,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryFamilyID(wmem, Family.KLL.getID() - 1);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -44,7 +55,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemorySerVer(wmem, SERIAL_VERSION_EMPTY_FULL - 1);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -53,7 +64,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryFlags(wmem, EMPTY_BIT_MASK | SINGLE_ITEM_BIT_MASK);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -63,7 +74,7 @@
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryFlags(wmem, UPDATABLE_BIT_MASK);
     setMemorySerVer(wmem, SERIAL_VERSION_EMPTY_FULL);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -73,7 +84,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryPreInts(wmem, PREAMBLE_INTS_FULL);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -83,7 +94,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemorySerVer(wmem, SERIAL_VERSION_EMPTY_FULL);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -92,7 +103,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryPreInts(wmem, PREAMBLE_INTS_FULL);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, DOUBLES_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -102,7 +113,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemorySerVer(wmem, SERIAL_VERSION_EMPTY_FULL);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, DOUBLES_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -111,7 +122,7 @@
     byte[] byteArr = KllHelper.toUpdatableByteArrayImpl(sk);
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryPreInts(wmem, PREAMBLE_INTS_EMPTY_SINGLE);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, DOUBLES_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -121,7 +132,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryPreInts(wmem, PREAMBLE_INTS_EMPTY_SINGLE);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -131,7 +142,7 @@
     byte[] byteArr = KllHelper.toUpdatableByteArrayImpl(sk);
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryPreInts(wmem, PREAMBLE_INTS_EMPTY_SINGLE);
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, FLOATS_SKETCH);
   }
 
   @Test(expectedExceptions = SketchesArgumentException.class)
@@ -141,7 +152,7 @@
     byte[] byteArr = sk.toByteArray();
     WritableMemory wmem = WritableMemory.writableWrap(byteArr);
     setMemoryPreInts(wmem, PREAMBLE_INTS_FULL);//should be 2, single
-    KllMemoryValidate memVal = new KllMemoryValidate(wmem);
+    KllMemoryValidate memVal = new KllMemoryValidate(wmem, DOUBLES_SKETCH);
   }
 
 }
diff --git a/src/test/java/org/apache/datasketches/kll/KllMiscDirectDoublesTest.java b/src/test/java/org/apache/datasketches/kll/KllMiscDirectDoublesTest.java
index 0cf1890..3864279 100644
--- a/src/test/java/org/apache/datasketches/kll/KllMiscDirectDoublesTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllMiscDirectDoublesTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.kll;
 
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -322,13 +323,13 @@
     for (int i = 1; i <= k + 1; i++) { sk.update(i); }
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllDoublesSketch.writableWrap(wmem, memReqSvr);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -337,13 +338,13 @@
     sk = getDDSketch(k, 0);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllDoublesSketch.writableWrap(wmem, memReqSvr);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -353,13 +354,13 @@
     sk.update(1);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllDoublesSketch.writableWrap(wmem, memReqSvr);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
diff --git a/src/test/java/org/apache/datasketches/kll/KllMiscDirectFloatsTest.java b/src/test/java/org/apache/datasketches/kll/KllMiscDirectFloatsTest.java
index 4755a4a..f73a441 100644
--- a/src/test/java/org/apache/datasketches/kll/KllMiscDirectFloatsTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllMiscDirectFloatsTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.kll;
 
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -323,13 +324,13 @@
     for (int i = 1; i <= k + 1; i++) { sk.update(i); }
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllFloatsSketch.writableWrap(wmem, memReqSvr);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -338,13 +339,13 @@
     sk = getDFSketch(k, 0);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllFloatsSketch.writableWrap(wmem, memReqSvr);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -354,13 +355,13 @@
     sk.update(1);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllFloatsSketch.writableWrap(wmem, memReqSvr);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
diff --git a/src/test/java/org/apache/datasketches/kll/KllMiscDoublesTest.java b/src/test/java/org/apache/datasketches/kll/KllMiscDoublesTest.java
index fd6f52c..4d5d3da 100644
--- a/src/test/java/org/apache/datasketches/kll/KllMiscDoublesTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllMiscDoublesTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.kll;
 
+import static org.apache.datasketches.kll.KllSketch.SketchType.DOUBLES_SKETCH;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -253,7 +254,7 @@
     //println(sk.toString(true, true));
     compBytes = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true));
     sk = KllDoublesSketch.heapify(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), k + 1);
@@ -273,7 +274,7 @@
     //println(sk.toString(true, true));
     compBytes = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true));
     sk = KllDoublesSketch.heapify(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 0);
@@ -294,7 +295,7 @@
     println(sk2.toString(true, true));
     compBytes = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true));
     sk = KllDoublesSketch.heapify(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 1);
@@ -324,7 +325,7 @@
     //println(sk2.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true));
     sk = KllHeapDoublesSketch.heapifyImpl(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), k + 1);
@@ -344,7 +345,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true));
     sk = KllHeapDoublesSketch.heapifyImpl(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 0);
@@ -365,7 +366,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true));
     sk = KllHeapDoublesSketch.heapifyImpl(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 1);
@@ -396,13 +397,13 @@
     for (int i = 1; i <= k + 1; i++) { sk.update(i); }
     compBytes = sk.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllDoublesSketch.heapify(wmem);
     compBytes2 = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(compBytes, compBytes2);
@@ -411,13 +412,13 @@
     sk = KllDoublesSketch.newHeapInstance(20);
     compBytes = sk.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllDoublesSketch.heapify(wmem);
     compBytes2 = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(compBytes, compBytes2);
@@ -427,13 +428,13 @@
     sk.update(1);
     compBytes = sk.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllDoublesSketch.heapify(wmem);
     compBytes2 = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(compBytes, compBytes2);
@@ -454,13 +455,13 @@
     for (int i = 1; i <= k + 1; i++) { sk.update(i); }
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllHeapDoublesSketch.heapifyImpl(wmem);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s); //note: heapify does not copy garbage, while toUpdatableByteArray does
     assertEquals(sk.getN(), sk2.getN());
@@ -472,13 +473,13 @@
     sk = KllDoublesSketch.newHeapInstance(k);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllHeapDoublesSketch.heapifyImpl(wmem);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -488,13 +489,13 @@
     sk.update(1);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllHeapDoublesSketch.heapifyImpl(wmem);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, DOUBLES_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -542,18 +543,6 @@
   }
 
   @Test
-  public void checkInheritanceArtifacts() {
-    KllDoublesSketch sk = KllDoublesSketch.newHeapInstance(20);
-    try { sk.getFloatItemsArray(); fail();} catch (SketchesArgumentException e) {}
-    try { sk.getMaxFloatItem(); fail();} catch (SketchesArgumentException e) {}
-    try { sk.getMinFloatItem(); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setFloatItemsArray(null); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setFloatItemsArrayAt(0, 0f); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setMaxFloatItem(0); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setMinFloatItem(0); fail();} catch (SketchesArgumentException e) {}
-  }
-
-  @Test
   public void printlnTest() {
     String s = "PRINTING:  printf in " + this.getClass().getName();
     println(s);
diff --git a/src/test/java/org/apache/datasketches/kll/KllMiscFloatsTest.java b/src/test/java/org/apache/datasketches/kll/KllMiscFloatsTest.java
index 0642da6..ce27fa2 100644
--- a/src/test/java/org/apache/datasketches/kll/KllMiscFloatsTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllMiscFloatsTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.datasketches.kll;
 
+import static org.apache.datasketches.kll.KllSketch.SketchType.FLOATS_SKETCH;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -275,7 +276,7 @@
     println(sk2.toString(true, true));
     compBytes = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true));
     sk = KllFloatsSketch.heapify(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), k + 1);
@@ -295,7 +296,7 @@
     //println(sk.toString(true, true));
     compBytes = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true));
     sk = KllFloatsSketch.heapify(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 0);
@@ -316,7 +317,7 @@
     //println(sk2.toString(true, true));
     compBytes = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true));
     sk = KllFloatsSketch.heapify(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 1);
@@ -346,7 +347,7 @@
     //println(sk2.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true));
     sk = KllHeapFloatsSketch.heapifyImpl(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), k + 1);
@@ -366,7 +367,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true));
     sk = KllHeapFloatsSketch.heapifyImpl(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 0);
@@ -387,7 +388,7 @@
     //println(sk.toString(true, true));
     compBytes = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(compBytes);
-    println(KllPreambleUtil.toString(wmem, true));
+    println(KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true));
     sk = KllHeapFloatsSketch.heapifyImpl(wmem);
     assertEquals(sk.getK(), k);
     assertEquals(sk.getN(), 1);
@@ -418,13 +419,13 @@
     for (int i = 1; i <= k + 1; i++) { sk.update(i); }
     compBytes = sk.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllFloatsSketch.heapify(wmem);
     compBytes2 = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(compBytes, compBytes2);
@@ -433,13 +434,13 @@
     sk = KllFloatsSketch.newHeapInstance(k);
     compBytes = sk.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllFloatsSketch.heapify(wmem);
     compBytes2 = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(compBytes, compBytes2);
@@ -449,13 +450,13 @@
     sk.update(1);
     compBytes = sk.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllFloatsSketch.heapify(wmem);
     compBytes2 = sk2.toByteArray();
     wmem = WritableMemory.writableWrap(compBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(compBytes, compBytes2);
@@ -476,13 +477,13 @@
     for (int i = 1; i <= k + 1; i++) { sk.update(i); }
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllHeapFloatsSketch.heapifyImpl(wmem);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s); //note: heapify does not copy garbage, while toUpdatableByteArray does
     assertEquals(sk.getN(), sk2.getN());
@@ -494,13 +495,13 @@
     sk = KllFloatsSketch.newHeapInstance(k);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllHeapFloatsSketch.heapifyImpl(wmem);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -510,13 +511,13 @@
     sk.update(1);
     upBytes = KllHelper.toUpdatableByteArrayImpl(sk);
     wmem = WritableMemory.writableWrap(upBytes);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 1: sketch to byte[]/memory & analyze memory");
     println(s);
     sk2 = KllHeapFloatsSketch.heapifyImpl(wmem);
     upBytes2 = KllHelper.toUpdatableByteArrayImpl(sk2);
     wmem = WritableMemory.writableWrap(upBytes2);
-    s = KllPreambleUtil.toString(wmem, true);
+    s = KllPreambleUtil.toString(wmem, FLOATS_SKETCH, true);
     println("step 2: memory to heap sketch, to byte[]/memory & analyze memory. Should match above");
     println(s);
     assertEquals(upBytes, upBytes2);
@@ -562,18 +563,6 @@
     assertEquals(skCompact.getFloatSingleItem(), 1.0F);
   }
 
-  //@Test
-  public void checkInheritanceArtifacts() {
-    KllFloatsSketch sk = KllFloatsSketch.newHeapInstance(20);
-    try { sk.getDoubleItemsArray(); fail();} catch (SketchesArgumentException e) {}
-    try { sk.getMaxDoubleItem(); fail();} catch (SketchesArgumentException e) {}
-    try { sk.getMinDoubleItem(); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setDoubleItemsArray(null); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setDoubleItemsArrayAt(0, 0f); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setMaxDoubleItem(0); fail();} catch (SketchesArgumentException e) {}
-    try { sk.setMinDoubleItem(0); fail();} catch (SketchesArgumentException e) {}
-  }
-
   @Test
   public void printlnTest() {
     String s = "PRINTING:  printf in " + this.getClass().getName();
diff --git a/src/test/java/org/apache/datasketches/quantiles/KolmogorovSmirnovTest.java b/src/test/java/org/apache/datasketches/quantiles/KolmogorovSmirnovTest.java
index 20d5f1b..fd8e4f7 100644
--- a/src/test/java/org/apache/datasketches/quantiles/KolmogorovSmirnovTest.java
+++ b/src/test/java/org/apache/datasketches/quantiles/KolmogorovSmirnovTest.java
@@ -43,7 +43,6 @@
      s1.update(x + 500);
      s2.update(x);
    }
-   //TODO NEED TO FIX KS Algo, it assumed non-inclusive cumulative weight arrays
    //assertEquals(KolmogorovSmirnov.computeKSDelta(s1, s2), 1.0, 1E-6);
    println("D = " + KolmogorovSmirnov.computeKSDelta(s1, s2));
  }
diff --git a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesUnionTest.java b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesUnionTest.java
index fd530a1..5171c65 100644
--- a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesUnionTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesUnionTest.java
@@ -467,7 +467,7 @@
     WritableMemory mem2 = WritableMemory.writableWrap(new byte[1_000_000]);
     ArrayOfDoublesCompactSketch dcsk = sketch.compact(mem2);
     ArrayOfDoublesUnion union = ArrayOfDoublesSketches.wrapUnion(mem); //empty union
-    union.union(dcsk); //TODO est error
+    union.union(dcsk);
     //ArrayOfDoublesSketches.wrapUnion(mem).union(sketch.compact(WritableMemory.writableWrap(new byte[1_000_000])));
 
     final ArrayOfDoublesSketch result = ArrayOfDoublesUnion.wrap(mem).getResult();