diff --git a/src/main/java/org/apache/datasketches/SetOperationCornerCases.java b/src/main/java/org/apache/datasketches/SetOperationCornerCases.java
index 280c78f..0ff5804 100644
--- a/src/main/java/org/apache/datasketches/SetOperationCornerCases.java
+++ b/src/main/java/org/apache/datasketches/SetOperationCornerCases.java
@@ -26,8 +26,8 @@
   private static final long MAX = Long.MAX_VALUE;
 
   public enum IntersectResult {
-    NEW_1_0_T(1, "New{1.0, 0, T}"),
-    RESULTDEGEN_MIN_0_F(2, "New{MinTheta, 0, F}"),
+    EMPTY_1_0_T(1, "Empty{1.0, 0, T}"),
+    DEGEN_MIN_0_F(2, "Degenerate{MinTheta, 0, F}"),
     FULL_INTER(6, "Full Intersect");
 
     private int interRid;
@@ -48,9 +48,9 @@
   }
 
   public enum AnotbResult {
-    NEW_1_0_T(1, "New{1.0, 0, T}"),
-    RESULTDEGEN_MIN_0_F(2, "New{MinTheta, 0, F}"),
-    RESULTDEGEN_THA_0_F(3, "New{ThetaA, 0, F}"),
+    EMPTY_1_0_T(1, "Empty{1.0, 0, T}"),
+    DEGEN_MIN_0_F(2, "Degenerate{MinTheta, 0, F}"),
+    DEGEN_THA_0_F(3, "Degenerate{ThetaA, 0, F}"),
     SKA_TRIM(4, "Trim Sketch A by MinTheta"),
     SKETCH_A(5, "Sketch A Exactly"),
     FULL_ANOTB(7, "Full AnotB");
@@ -73,60 +73,41 @@
   }
 
   public enum CornerCase {
-    ResultDegen_ResultDegen(0,  "A{<1.0, 0, F} ; B{<1.0, 0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.RESULTDEGEN_MIN_0_F), //0
-    ResultDegen_NewDegen(01,    "A{<1.0, 0, F} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.RESULTDEGEN_THA_0_F),   //1
-    ResultDegen_Estimation(02,  "A{<1.0, 0, F} ; B{<1.0,>0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.RESULTDEGEN_MIN_0_F), //2
-    ResultDegen_New(05,         "A{<1.0, 0, F} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.RESULTDEGEN_THA_0_F),   //5
-    ResultDegen_Exact(06,       "A{<1.0, 0, F} ; B{ 1.0,>0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.RESULTDEGEN_THA_0_F), //6
+    Empty_Empty(055, "A{ 1.0, 0, T} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
+    Empty_Exact(056, "A{ 1.0, 0, T} ; B{ 1.0,>0, F}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
+    Empty_Estimation(052, "A{ 1.0, 0, T} ; B{<1.0,>0, F}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
+    Empty_Degen(050, "A{ 1.0, 0, T} ; B{<1.0, 0, F}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
 
-    NewDegen_ResultDegen(010,   "A{<1.0, 0, T} ; B{<1.0, 0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),     //8
-    NewDegen_NewDegen(011,      "A{<1.0, 0, T} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),     //9
-    NewDegen_Estimation(012,    "A{<1.0, 0, T} ; B{<1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //10
-    NewDegen_New(015,           "A{<1.0, 0, T} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //13
-    NewDegen_Exact(016,         "A{<1.0, 0, T} ; B{ 1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //14
+    Exact_Empty(065, "A{ 1.0,>0, F} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.SKETCH_A),
+    Exact_Exact(066, "A{ 1.0,>0, F} ; B{ 1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Exact_Estimation(062, "A{ 1.0,>0, F} ; B{<1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Exact_Degen(060, "A{ 1.0,>0, F} ; B{<1.0, 0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.SKA_TRIM),
 
-    Estimation_ResultDegen(020, "A{<1.0,>0, F} ; B{<1.0, 0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.SKA_TRIM),   //16
-    Estimation_NewDegen(021,    "A{<1.0,>0, F} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //17
-    Estimation_Estimation(022,  "A{<1.0,>0, F} ; B{<1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),  //18
-    Estimation_New(025,         "A{<1.0,>0, F} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //21
-    Estimation_Exact(026,       "A{<1.0,>0, F} ; B{ 1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),  //22
+    Estimation_Empty(025, "A{<1.0,>0, F} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.SKETCH_A),
+    Estimation_Exact(026, "A{<1.0,>0, F} ; B{ 1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Estimation_Estimation(022, "A{<1.0,>0, F} ; B{<1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Estimation_Degen(020, "A{<1.0,>0, F} ; B{<1.0, 0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.SKA_TRIM),
 
-    New_ResultDegen(050,        "A{ 1.0, 0, T} ; B{<1.0, 0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //40
-    New_NewDegen(051,           "A{ 1.0, 0, T} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //41
-    New_Estimation(052,         "A{ 1.0, 0, T} ; B{<1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //42
-    New_New(055,                "A{ 1.0, 0, T} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //45
-    New_Exact(056,              "A{ 1.0, 0, T} ; B{ 1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //46
-
-    Exact_ResultDegen(060,      "A{ 1.0,>0, F} ; B{<1.0, 0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.SKA_TRIM),   //48
-    Exact_NewDegen(061,         "A{ 1.0,>0, F} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //49
-    Exact_Estimation(062,       "A{ 1.0,>0, F} ; B{<1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),  //50
-    Exact_New(065,              "A{ 1.0,>0, F} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //53
-    Exact_Exact(066,            "A{ 1.0,>0, F} ; B{ 1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB);  //54
+    Degen_Empty(005, "A{<1.0, 0, F} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.DEGEN_THA_0_F),
+    Degen_Exact(006, "A{<1.0, 0, F} ; B{ 1.0,>0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_THA_0_F),
+    Degen_Estimation(002, "A{<1.0, 0, F} ; B{<1.0,>0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_MIN_0_F),
+    Degen_Degen(000, "A{<1.0, 0, F} ; B{<1.0, 0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_MIN_0_F);
 
     private static final Map<Integer, CornerCase> idToCornerCaseMap = new HashMap<>();
     private int id;
@@ -168,21 +149,20 @@
     public static CornerCase idToCornerCase(final int id) {
       final CornerCase cc = idToCornerCaseMap.get(id);
       if (cc == null) {
-        throw new SketchesArgumentException("Possible Corruption: Illegal CornerCase ID: " + id);
+        throw new SketchesArgumentException("Possible Corruption: Illegal CornerCase ID: " + Integer.toOctalString(id));
       }
       return cc;
     }
-  } //end of enum
+  } //end of enum CornerCase
 
   public static int createCornerCaseId(
       final long thetaLongA, final int countA, final boolean emptyA,
       final long thetaLongB, final int countB, final boolean emptyB) {
-    return ((thetaLongA < MAX) ? 0 : 1 << 5)
-         | ((countA == 0)      ? 0 : 1 << 4)
-         | (!emptyA            ? 0 : 1 << 3)
-         | ((thetaLongB < MAX) ? 0 : 1 << 2)
-         | ((countB == 0)      ? 0 : 1 << 1)
-         | (!emptyB            ? 0 : 1);
+    return (sketchStateId(emptyA, countA, thetaLongA) << 3) | sketchStateId(emptyB, countB, thetaLongB);
   }
 
+  public static int sketchStateId(final boolean isEmpty, final int numRetained, final long theta) {
+    // assume theta = MAX if empty
+    return (((theta == MAX) || isEmpty) ? 4 : 0) | ((numRetained > 0) ? 2 : 0) | (isEmpty ? 1 : 0);
+  }
 }
diff --git a/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java b/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
index 1958b90..7e99cd4 100644
--- a/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
+++ b/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
@@ -139,7 +139,7 @@
 
   @Override
   public long getThetaLong() {
-    return wmem_.getLong(THETA_LONG);
+    return isEmpty() ? Long.MAX_VALUE : wmem_.getLong(THETA_LONG);
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java b/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java
index e5b7373..0333bf5 100644
--- a/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java
+++ b/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java
@@ -159,7 +159,7 @@
 
   @Override
   public long getThetaLong() {
-    return thetaLong_;
+    return empty_ ? Long.MAX_VALUE : thetaLong_;
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/tuple/AnotB.java b/src/main/java/org/apache/datasketches/tuple/AnotB.java
index d570665..5d9702e 100644
--- a/src/main/java/org/apache/datasketches/tuple/AnotB.java
+++ b/src/main/java/org/apache/datasketches/tuple/AnotB.java
@@ -156,17 +156,17 @@
     final AnotbResult anotbResult = cCase.getAnotbResult();
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         reset();
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         reset();
         thetaLong_ = min(thetaLong_, thetaLongB);
         empty_ = false;
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         empty_ = false;
         curCount_ = 0;
         //thetaLong_ is ok
@@ -229,17 +229,17 @@
     final AnotbResult anotbResult = cCase.getAnotbResult();
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         reset();
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         reset();
         thetaLong_ = min(thetaLong_, thetaLongB);
         empty_ = false;
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         empty_ = false;
         curCount_ = 0;
         //thetaLong_ is ok
@@ -335,16 +335,16 @@
     CompactSketch<S> result = null;
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         result = new CompactSketch<>(null, null, Long.MAX_VALUE, true);
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         final long thetaLong = min(thetaLongA, thetaLongB);
         result = new CompactSketch<>(null, null, thetaLong, false);
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         result = new CompactSketch<>(null, null, thetaLongA, false);
         break;
       }
@@ -427,16 +427,16 @@
     CompactSketch<S> result = null;
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         result = new CompactSketch<>(null, null, Long.MAX_VALUE, true);
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         final long thetaLong = min(thetaLongA, thetaLongB);
         result = new CompactSketch<>(null, null, thetaLong, false);
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         result = new CompactSketch<>(null, null, thetaLongA, false);
         break;
       }
diff --git a/src/main/java/org/apache/datasketches/tuple/Sketch.java b/src/main/java/org/apache/datasketches/tuple/Sketch.java
index e7d767e..ef11a0f 100644
--- a/src/main/java/org/apache/datasketches/tuple/Sketch.java
+++ b/src/main/java/org/apache/datasketches/tuple/Sketch.java
@@ -162,7 +162,7 @@
    * @return the value of theta as a double
    */
   public double getTheta() {
-    return thetaLong_ / (double) Long.MAX_VALUE;
+    return getThetaLong() / (double) Long.MAX_VALUE;
   }
 
   /**
@@ -186,7 +186,7 @@
    * @return Theta as a long
    */
   public long getThetaLong() {
-    return thetaLong_;
+    return isEmpty() ? Long.MAX_VALUE : thetaLong_;
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java b/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java
index 2c0e3b2..a127153 100644
--- a/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java
@@ -179,7 +179,7 @@
    * @return the value of theta as a double
    */
   public double getTheta() {
-    return theta_ / (double) Long.MAX_VALUE;
+    return getThetaLong() / (double) Long.MAX_VALUE;
   }
 
   /**
@@ -201,7 +201,7 @@
    * @return the value of theta as a long
    */
   long getThetaLong() {
-    return theta_;
+    return isEmpty() ? Long.MAX_VALUE : theta_;
   }
 
   abstract short getSeedHash();
diff --git a/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java b/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java
index 96018af..eef015f 100644
--- a/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java
+++ b/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java
@@ -39,21 +39,18 @@
 
   private static final long GT_MIDP_V   = 3L;
   private static final float MIDP       = 0.5f;
-  private static final long LT_MIDP_V   = 2L;
 
   private static final long GT_LOWP_V   = 6L;
   private static final float LOWP       = 0.1f;
   private static final long LT_LOWP_V   = 4L;
 
-  private static final double MIDP_THETA = MIDP;
   private static final double LOWP_THETA = LOWP;
 
   private enum SkType {
-    NEW,          //{ 1.0,  0, T} Bin: 101  Oct: 05
-    EXACT,        //{ 1.0, >0, F} Bin: 110  Oct: 06, specify only value
-    ESTIMATION,   //{<1.0, >0, F} Bin: 010  Oct: 02, specify only value
-    NEW_DEGEN,    //{<1.0,  0, T} Bin: 001  Oct: 01, specify only p
-    RESULT_DEGEN  //{<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
+    EMPTY,      // { 1.0,  0, T} Bin: 101  Oct: 05
+    EXACT,      // { 1.0, >0, F} Bin: 110  Oct: 06, specify only value
+    ESTIMATION, // {<1.0, >0, F} Bin: 010  Oct: 02, specify only value
+    DEGENERATE  // {<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
   }
 
   //NOTE: 0 values in getSketch are not used.
@@ -69,7 +66,6 @@
       boolean resultAnotbEmpty) {
     CompactSketch csk;
 
-    //Intersection
     Intersection inter = SetOperation.builder().buildIntersection();
 
     csk = inter.intersect(thetaA, thetaB);
@@ -77,7 +73,6 @@
     csk = inter.intersect(thetaA.compact(), thetaB.compact());
     checkResult("Intersect Stateless Theta, Theta", csk, resultInterTheta, resultInterCount, resultInterEmpty);
 
-    //AnotB
     AnotB anotb = SetOperation.builder().buildANotB();
 
     csk = anotb.aNotB(thetaA, thetaB);
@@ -98,9 +93,9 @@
 
 
   @Test
-  public void newNew() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW,    0, 0);
+  public void emptyEmpty() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -113,9 +108,9 @@
   }
 
   @Test
-  public void newExact() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,  0, GT_MIDP_V);
+  public void emptyExact() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -128,9 +123,9 @@
   }
 
   @Test
-  public void newNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,       0, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN, LOWP, 0);
+  public void emptyDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -143,23 +138,8 @@
   }
 
   @Test
-  public void newResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,          0, 0);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newNewEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,        0, 0);
+  public void EmptyEstimation() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
     UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
@@ -175,9 +155,9 @@
   /*********************/
 
   @Test
-  public void exactNew() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW,    0, 0);
+  public void exactEmpty() {
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -191,8 +171,8 @@
 
   @Test
   public void exactExact() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,  0, GT_MIDP_V);
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -205,24 +185,9 @@
   }
 
   @Test
-  public void exactNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,     0, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void exactResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,        0, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
+  public void exactDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -236,7 +201,7 @@
 
   @Test
   public void exactEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,      0, LT_LOWP_V);
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, LT_LOWP_V);
     UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
@@ -252,9 +217,9 @@
   /*********************/
 
   @Test
-  public void estimationNew() {
+  public void estimationEmpty() {
     UpdateSketch thetaA = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW,        0, 0);
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -269,7 +234,7 @@
   @Test
   public void estimationExact() {
     UpdateSketch thetaA = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,      0, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -282,24 +247,9 @@
   }
 
   @Test
-  public void estimationNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.ESTIMATION,  MIDP, LT_MIDP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void estimationResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.ESTIMATION,   MIDP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
+  public void estimationDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -313,8 +263,8 @@
 
   @Test
   public void estimationEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.ESTIMATION,  MIDP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.ESTIMATION,  LOWP, LT_LOWP_V);
+    UpdateSketch thetaA = getSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -329,146 +279,54 @@
   /*********************/
 
   @Test
-  public void newDegenNew() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW,         0, 0);
+  public void DegenerateEmpty() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenExact() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,  LOWP,0);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,      0, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
+  public void DegenerateExact() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE,  LOWP, GT_LOWP_V); //entries = 0
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, LT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN, MIDP, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
+  public void DegenerateDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,    MIDP, 0);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newDegenEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,  MIDP, 0);
+  public void DegenerateEstimation() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
     UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  /*********************/
-
-  @Test
-  public void resultDegenNew() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.NEW,           0, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenExact() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN,  LOWP, GT_LOWP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.EXACT,         0, LT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN,    LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.ESTIMATION,   LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -505,34 +363,29 @@
     bldr.setLogNominalEntries(4);
     UpdateSketch sk;
     switch(skType) {
-      case NEW: {      //{ 1.0,  0, T} Bin: 101  Oct: 05
+      case EMPTY: { // { 1.0,  0, T}
         sk = bldr.build();
         break;
       }
-      case EXACT: {     //{ 1.0, >0, F} Bin: 111  Oct: 07
+      case EXACT: { // { 1.0, >0, F}
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case ESTIMATION: {   //{<1.0, >0, F} Bin: 010  Oct: 02
+      case ESTIMATION: { // {<1.0, >0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case NEW_DEGEN: {    //{<1.0,  0, T} Bin: 001  Oct: 01
-        bldr.setP(p);
-        sk = bldr.build();
-        break;
-      }
-      case RESULT_DEGEN: { //{<1.0,  0, F} Bin: 000  Oct: 0
+      case DEGENERATE: { // {<1.0,  0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value);
         break;
       }
 
-      default: { return null; } //should not happen
+      default: { return null; } // should not happen
     }
     return sk;
   }
diff --git a/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java b/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java
index 87396d9..21bc7a3 100644
--- a/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java
@@ -104,8 +104,8 @@
     Assert.assertEquals(sketch.getEstimate(), 0.0);
     Assert.assertEquals(sketch.getUpperBound(1), 0.0);
     Assert.assertEquals(sketch.getLowerBound(1), 0.0);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
+    Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE);
+    Assert.assertEquals(sketch.getTheta(), 1.0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java b/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java
index 9ca0181..7d518b0 100644
--- a/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java
@@ -45,13 +45,11 @@
 
   private static final long GT_MIDP_V   = 3L;
   private static final float MIDP       = 0.5f;
-  private static final long LT_MIDP_V   = 2L;
 
   private static final long GT_LOWP_V   = 6L;
   private static final float LOWP       = 0.1f;
   private static final long LT_LOWP_V   = 4L;
 
-  private static final double MIDP_THETA = MIDP;
   private static final double LOWP_THETA = LOWP;
 
   private IntegerSummary.Mode mode = IntegerSummary.Mode.Min;
@@ -59,11 +57,10 @@
   private IntegerSummarySetOperations setOperations = new IntegerSummarySetOperations(mode, mode);
 
   private enum SkType {
-    NEW,         //{ 1.0,  0, T} Bin: 101  Oct: 05
-    EXACT,       //{ 1.0, >0, F} Bin: 110  Oct: 06, specify only value
-    ESTIMATION,  //{<1.0, >0, F} Bin: 010  Oct: 02, specify only value
-    NEW_DEGEN,   //{<1.0,  0, T} Bin: 001  Oct: 01, specify only p
-    RESULT_DEGEN //{<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
+    EMPTY,      // { 1.0,  0, T} Bin: 101  Oct: 05
+    EXACT,      // { 1.0, >0, F} Bin: 110  Oct: 06, specify only value
+    ESTIMATION, // {<1.0, >0, F} Bin: 010  Oct: 02, specify only value
+    DEGENERATE  // {<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
   }
 
   //NOTE: 0 values in getTupleSketch or getThetaSketch are not used.
@@ -80,7 +77,6 @@
       boolean resultAnotbEmpty) {
     CompactSketch<IntegerSummary> csk;
 
-    //Intersection
     Intersection<IntegerSummary> inter = new Intersection<>(setOperations);
 
     csk = inter.intersect(tupleA, tupleB);
@@ -93,8 +89,6 @@
     csk = inter.intersect(tupleA.compact(), thetaB.compact(), intSum);
     checkResult("Intersect Stateless Tuple, Theta", csk, resultInterTheta, resultInterCount, resultInterEmpty);
 
-
-    //AnotB
     csk = AnotB.aNotB(tupleA, tupleB);
     checkResult("AnotB Stateless Tuple, Tuple", csk, resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
     csk = AnotB.aNotB(tupleA.compact(), tupleB.compact());
@@ -129,10 +123,10 @@
 
 
   @Test
-  public void newNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,    0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,    0, 0);
+  public void emptyEmpty() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -145,10 +139,10 @@
   }
 
   @Test
-  public void newExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,    0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,  0, GT_MIDP_V);
+  public void emptyExact() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -161,10 +155,10 @@
   }
 
   @Test
-  public void newNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,       0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN, LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN, LOWP, 0);
+  public void EmptyDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -177,24 +171,8 @@
   }
 
   @Test
-  public void newResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,          0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newNewEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,        0, 0);
+  public void emptyEstimation() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
     IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = 1.0;
@@ -211,10 +189,10 @@
   /*********************/
 
   @Test
-  public void exactNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,    0, 0);
+  public void exactEmpty() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -228,9 +206,9 @@
 
   @Test
   public void exactExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,  0, GT_MIDP_V);
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -243,26 +221,10 @@
   }
 
   @Test
-  public void exactNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,     0, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN, LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void exactResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,        0, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
+  public void exactDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -276,7 +238,7 @@
 
   @Test
   public void exactEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,      0, LT_LOWP_V);
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
     IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
@@ -293,10 +255,10 @@
   /*********************/
 
   @Test
-  public void estimationNew() {
+  public void estimationEmpty() {
     IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,        0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,        0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -311,8 +273,8 @@
   @Test
   public void estimationExact() {
     IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,      0, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,      0, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -325,26 +287,10 @@
   }
 
   @Test
-  public void estimationNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION,  MIDP, LT_MIDP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void estimationResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION,   MIDP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
+  public void estimationDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -358,9 +304,9 @@
 
   @Test
   public void estimationEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION,  MIDP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION,  LOWP, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION,  LOWP, LT_LOWP_V);
+    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -375,156 +321,58 @@
   /*********************/
 
   @Test
-  public void newDegenNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,         0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,         0, 0);
+  public void degenerateEmpty() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN, LOWP,0);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,      0, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,      0, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
+  public void degenerateExact() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, LT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN, MIDP, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN, LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
+  public void degenerateDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN,    MIDP, 0);
-    IntegerSketch tupleB =  getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =   getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newDegenEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN,  MIDP, 0);
+  public void degenerateEstimation() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
     IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  /*********************/
-
-  @Test
-  public void resultDegenNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,           0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,           0, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN,  LOWP, GT_LOWP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,         0, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,         0, LT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN,    LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN,    LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION,   LOWP, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION,   LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -550,9 +398,9 @@
     if (!thetaOk || !entriesOk || !emptyOk) {
       StringBuilder sb = new StringBuilder();
       sb.append(comment + ": ");
-      if (!thetaOk)   { sb.append("Got: " + skTheta + ", Expected: " + theta + "; "); }
-      if (!entriesOk) { sb.append("Got: " + skEntries + ", Expected: " + entries + "; "); }
-      if (!emptyOk)   { sb.append("Got: " + skEmpty + ", Expected: " + empty + "."); }
+      if (!thetaOk)   { sb.append("theta: expected " + theta + ", got " + skTheta + "; "); }
+      if (!entriesOk) { sb.append("entries: expected " + entries + ", got " + skEntries + "; "); }
+      if (!emptyOk)   { sb.append("empty: expected " + empty + ", got " + skEmpty + "."); }
       throw new IllegalArgumentException(sb.toString());
     }
   }
@@ -561,31 +409,27 @@
 
     IntegerSketch sk;
     switch(skType) {
-      case NEW: {      //{ 1.0,  0, T} Bin: 101  Oct: 05
+      case EMPTY: { // { 1.0,  0, T}
         sk = new IntegerSketch(4, 2, 1.0f, IntegerSummary.Mode.Min);
         break;
       }
-      case EXACT: {     //{ 1.0, >0, F} Bin: 111  Oct: 07
+      case EXACT: { // { 1.0, >0, F}
         sk = new IntegerSketch(4, 2, 1.0f, IntegerSummary.Mode.Min);
         sk.update(value, 1);
         break;
       }
-      case ESTIMATION: {   //{<1.0, >0, F} Bin: 010  Oct: 02
+      case ESTIMATION: { // {<1.0, >0, F}
         sk = new IntegerSketch(4, 2, p, IntegerSummary.Mode.Min);
         sk.update(value, 1);
         break;
       }
-      case NEW_DEGEN: {    //{<1.0,  0, T} Bin: 001  Oct: 01
-        sk =  new IntegerSketch(4, 2, p, IntegerSummary.Mode.Min);
-        break;
-      }
-      case RESULT_DEGEN: { //{<1.0,  0, F} Bin: 000  Oct: 0
+      case DEGENERATE: { // {<1.0,  0, F}
         sk = new IntegerSketch(4, 2, p, IntegerSummary.Mode.Min);
         sk.update(value, 1); // > theta
         break;
       }
 
-      default: { return null; } //should not happen
+      default: { return null; } // should not happen
     }
     return sk;
   }
@@ -597,34 +441,29 @@
 
     UpdateSketch sk;
     switch(skType) {
-      case NEW: { //{ 1.0,  0, T} Bin: 101  Oct: 05
+      case EMPTY: { // { 1.0,  0, T}
         sk = bldr.build();
         break;
       }
-      case EXACT: { //{ 1.0, >0, F} Bin: 111  Oct: 07
+      case EXACT: { // { 1.0, >0, F}
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case ESTIMATION: {   //{<1.0, >0, F} Bin: 010  Oct: 02
+      case ESTIMATION: { // {<1.0, >0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case NEW_DEGEN: {    //{<1.0,  0, T} Bin: 001  Oct: 01
-        bldr.setP(p);
-        sk = bldr.build();
-        break;
-      }
-      case RESULT_DEGEN: { //{<1.0,  0, F} Bin: 000  Oct: 0
+      case DEGENERATE: { // {<1.0,  0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value); // > theta
         break;
       }
 
-      default: { return null; } //should not happen
+      default: { return null; } // should not happen
     }
     return sk;
   }
diff --git a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java
index c77664c..aae8c0b 100644
--- a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java
@@ -58,9 +58,8 @@
     Assert.assertEquals(sketch.getEstimate(), 0.0);
     Assert.assertEquals(sketch.getUpperBound(1), 0.0);
     Assert.assertEquals(sketch.getLowerBound(1), 0.0);
-    Assert.assertEquals(
-        (float)(sketch.getThetaLong() / (double) Long.MAX_VALUE), samplingProbability);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
+    Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE);
+    Assert.assertEquals(sketch.getTheta(), 1.0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java
index e27cda2..5156574 100644
--- a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java
@@ -53,8 +53,8 @@
     Assert.assertEquals(sketch.getEstimate(), 0.0);
     Assert.assertEquals(sketch.getUpperBound(1), 0.0);
     Assert.assertEquals(sketch.getLowerBound(1), 0.0);
-    Assert.assertEquals((float)(sketch.getThetaLong() / (double) Long.MAX_VALUE), samplingProbability);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
+    Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE);
+    Assert.assertEquals(sketch.getTheta(), 1.0);
   }
 
   @Test
