MNEMONIC-554: Diagnostic warning for sun.misc.Unsafe API
diff --git a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableArrayImpl.java b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableArrayImpl.java
index 56b3f1b..4d1bf32 100644
--- a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableArrayImpl.java
+++ b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableArrayImpl.java
@@ -30,8 +30,6 @@
 import org.apache.mnemonic.Utils;
 
 import java.util.NoSuchElementException;
-
-import sun.misc.Unsafe;
 import java.util.Iterator;
 
 @SuppressWarnings("restriction")
@@ -41,7 +39,8 @@
   private static final int MAX_OBJECT_SIZE = 8;
   private static long[][] fieldInfo;
   private Object[] genericField;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private EntityFactoryProxy[] factoryProxy;
   private DurableType[] genericType;
   private volatile boolean autoReclaim;
diff --git a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashMapImpl.java b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashMapImpl.java
index 061018f..6adcde4 100644
--- a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashMapImpl.java
+++ b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashMapImpl.java
@@ -31,7 +31,6 @@
 import org.apache.mnemonic.RetrieveDurableEntityError;
 import org.apache.mnemonic.Utils;
 import org.apache.commons.lang3.ArrayUtils;
-import sun.misc.Unsafe;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
@@ -43,7 +42,8 @@
   private static final float DEFAULT_MAP_LOAD_FACTOR = 0.75f;
   private static final long MAX_OBJECT_SIZE = 8;
   private static long[][] fieldInfo;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private EntityFactoryProxy[] factoryProxy;
   private EntityFactoryProxy[] listefproxies;
   private DurableType[] genericField;
@@ -56,7 +56,7 @@
   private A allocator;
   /**
    * Set initial capacity for a hashmap. It can grow in size.
-   * 
+   *
    * @param capacity
    *          Initial capacity to be set
    */
@@ -74,7 +74,7 @@
 
   /**
    * Add a new key-value pair to map
-   * 
+   *
    * @param key
    *          the key to be set
    *
@@ -97,7 +97,7 @@
 
   /**
    * Add a new key-value pair to map at a given bucket address
-   * 
+   *
    * @param key
    *          the key to be set
    *
@@ -181,7 +181,7 @@
 
   /**
    * Return a value to which key is mapped
-   * 
+   *
    * @param key
    *          the key whose value is to be retrieved
    *
@@ -197,7 +197,7 @@
 
   /**
    * Return a value to which key is mapped given a bucket address
-   * 
+   *
    * @param key
    *          the key whose value is to be retrieved
    *
@@ -227,7 +227,7 @@
 
   /**
    * Remove a mapping for a specified key
-   * 
+   *
    * @param key
    *          the key whose value is to be removed
    *
@@ -243,7 +243,7 @@
 
   /**
    * Remove a mapping for a specified key at given bucket address
-   * 
+   *
    * @param key
    *          the key whose value is to be removed
    *
@@ -272,12 +272,12 @@
         head = head.getNext();
       }
       if (true == found) {
-        if (null == prev) { 
+        if (null == prev) {
           if (null == head.getNext()) {
             unsafe.putAddress(bucketAddr, 0L);
             head.destroy();
           } else {
-            unsafe.putAddress(bucketAddr, head.getNext().getHandler());        
+            unsafe.putAddress(bucketAddr, head.getNext().getHandler());
             head.destroy();
           }
         } else {
@@ -285,19 +285,19 @@
           head.destroy();
         }
         mapSize--;
-      }       
+      }
     }
     return retValue;
   }
 
   /**
    * Rehashes the entire map into a new map of given capacity
-   * 
+   *
    * @param newCapacity
    *          the capacity of new map
    */
   public void resize(long newCapacity) {
-    MemChunkHolder<A> prevHolder = holder; 
+    MemChunkHolder<A> prevHolder = holder;
     long bucketAddr = prevHolder.get();
     long maxbucketAddr = bucketAddr + MAX_OBJECT_SIZE * totalCapacity;
     holder = allocator.createChunk(MAX_OBJECT_SIZE * newCapacity, autoReclaim);
@@ -328,7 +328,7 @@
 
   /**
    * Transfers a map item from old map to the new map
-   * 
+   *
    * @param elem
    *          the item in the old map
    */
@@ -349,7 +349,7 @@
 
   /**
    * Recomputes the size of the map during restore without persistence
-   * 
+   *
    *  @return size of the map
    */
   protected long recomputeMapSize() {
@@ -457,7 +457,7 @@
   }
 
   @Override
-  public void restoreDurableEntity(A allocator, EntityFactoryProxy[] factoryProxy, 
+  public void restoreDurableEntity(A allocator, EntityFactoryProxy[] factoryProxy,
              DurableType[] gField, long phandler, boolean autoReclaim, ReclaimContext rctx)
           throws RestoreDurableEntityError {
     initializeDurableEntity(allocator, factoryProxy, gField, autoReclaim, rctx);
@@ -477,7 +477,7 @@
 
 
   @Override
-  public void initializeDurableEntity(A allocator, EntityFactoryProxy[] factoryProxy, 
+  public void initializeDurableEntity(A allocator, EntityFactoryProxy[] factoryProxy,
               DurableType[] gField, boolean autoReclaim, ReclaimContext rctx) {
     this.allocator = allocator;
     this.factoryProxy = factoryProxy;
@@ -504,7 +504,7 @@
   }
 
   @Override
-  public void createDurableEntity(A allocator, EntityFactoryProxy[] factoryProxy, 
+  public void createDurableEntity(A allocator, EntityFactoryProxy[] factoryProxy,
               DurableType[] gField, boolean autoReclaim, ReclaimContext rctx) throws OutOfHybridMemory {
     initializeDurableEntity(allocator, factoryProxy, gField, autoReclaim, rctx);
     this.holder = allocator.createChunk(MAX_OBJECT_SIZE * totalCapacity, autoReclaim, reclaimcontext);
@@ -596,4 +596,3 @@
     }
   }
 }
- 
diff --git a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashSetImpl.java b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashSetImpl.java
index 253fc85..c54640b 100644
--- a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashSetImpl.java
+++ b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableHashSetImpl.java
@@ -28,7 +28,6 @@
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.mnemonic.resgc.ReclaimContext;
-import sun.misc.Unsafe;
 import java.util.Iterator;
 
 @SuppressWarnings("restriction")
@@ -36,7 +35,8 @@
         extends DurableHashSet<E> implements MemoryDurableEntity<A> {
 
   private static long[][] fieldInfo;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private EntityFactoryProxy[] factoryProxy;
   private DurableType[] genericType;
   private volatile boolean autoReclaim;
diff --git a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableSinglyLinkedListImpl.java b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableSinglyLinkedListImpl.java
index 9191761..be08f4b 100644
--- a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableSinglyLinkedListImpl.java
+++ b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableSinglyLinkedListImpl.java
@@ -26,13 +26,13 @@
 import org.apache.mnemonic.RetrieveDurableEntityError;
 import org.apache.mnemonic.Utils;
 import org.apache.mnemonic.resgc.ReclaimContext;
-import sun.misc.Unsafe;
 
 @SuppressWarnings("restriction")
 public class DurableSinglyLinkedListImpl<A extends RestorableAllocator<A>, E>
         extends DurableSinglyLinkedList<E> implements MemoryDurableEntity<A> {
   private static long[][] fieldInfo;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private EntityFactoryProxy[] factoryProxy;
   private DurableType[] genericType;
   private volatile boolean autoReclaim;
diff --git a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableTreeImpl.java b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableTreeImpl.java
index 6538fff..4c3f226 100644
--- a/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableTreeImpl.java
+++ b/mnemonic-collections/src/main/java/org/apache/mnemonic/collections/DurableTreeImpl.java
@@ -28,14 +28,13 @@
 import org.apache.mnemonic.RetrieveDurableEntityError;
 import org.apache.mnemonic.Utils;
 
-import sun.misc.Unsafe;
-
 @SuppressWarnings("restriction")
 public class DurableTreeImpl<A extends RestorableAllocator<A>, E extends Comparable<E>>
   extends DurableTree<E> implements MemoryDurableEntity<A> {
 
   private static long[][] fieldInfo;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private EntityFactoryProxy[] factoryProxy;
   private DurableType[] genericType;
   private volatile boolean autoReclaim;
diff --git a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableArrayNGTest.java b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableArrayNGTest.java
index 5bd39a5..67f91fd 100644
--- a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableArrayNGTest.java
+++ b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableArrayNGTest.java
@@ -39,8 +39,6 @@
 import org.testng.annotations.Test;
 import org.testng.Assert;
 
-import sun.misc.Unsafe;
-
 /**
  *
  *
@@ -50,7 +48,8 @@
   private long cKEYCAPACITY;
   private NonVolatileMemAllocator m_act;
   private Random rand;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
 
   protected DurableBuffer<NonVolatileMemAllocator>
       genuptBuffer(NonVolatileMemAllocator act, Checksum cs, int size) {
@@ -355,13 +354,13 @@
     Person<Long> person =  (Person<Long>) efproxies[1].create(m_act, null, null, false);
     person.setName("Alice", false);
     person.setAge((short) 31);
-    DurableHashMap<String, Person<Long>> first = DurableHashMapFactory.create(m_act, 
+    DurableHashMap<String, Person<Long>> first = DurableHashMapFactory.create(m_act,
                             efproxies, gtypes, 10, false);
     first.put("hello", person);
     Person<Long> anotherPerson =  (Person<Long>) efproxies[1].create(m_act, null, null, false);
     anotherPerson.setAge((short) 30);
     anotherPerson.setName("Bob", false);
-    DurableHashMap<String, Person<Long>> second = DurableHashMapFactory.create(m_act, 
+    DurableHashMap<String, Person<Long>> second = DurableHashMapFactory.create(m_act,
                             efproxies, gtypes, 10, false);
     second.put("world", anotherPerson);
 
diff --git a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashMapNGTest.java b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashMapNGTest.java
index 376d739..66682e4 100644
--- a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashMapNGTest.java
+++ b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashMapNGTest.java
@@ -39,8 +39,6 @@
 import org.testng.AssertJUnit;
 import org.testng.Assert;
 
-import sun.misc.Unsafe;
-
 /**
  *
  *
@@ -50,7 +48,8 @@
   private long cKEYCAPACITY;
   private NonVolatileMemAllocator m_act;
   private Random rand;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private long mInitialCapacity = 1;
 
   protected DurableBuffer<NonVolatileMemAllocator>
@@ -127,7 +126,7 @@
   public void testGetPutRemovePrimitives() {
     DurableType gtypes[] = {DurableType.STRING, DurableType.INTEGER};
     DurableHashMap<String, Integer> map = DurableHashMapFactory.create(m_act, null, gtypes, mInitialCapacity, false);
-    
+
     Long handler = map.getHandler();
     Integer val = map.put("hello", 1);
     AssertJUnit.assertNull(val);
@@ -142,7 +141,7 @@
 
     val = map.get("hello");
     AssertJUnit.assertEquals(3, val.intValue());
-    val = map.get("world"); 
+    val = map.get("world");
     AssertJUnit.assertEquals(2, val.intValue());
     val = map.get("test");
     AssertJUnit.assertNull(val);
@@ -170,11 +169,11 @@
     AssertJUnit.assertEquals(entry.getKey(), "hello");
     AssertJUnit.assertEquals(entry.getValue().intValue(), 3);
 
-    DurableHashMap<String, Integer> restoredMap = DurableHashMapFactory.restore(m_act, null, gtypes, handler, 
+    DurableHashMap<String, Integer> restoredMap = DurableHashMapFactory.restore(m_act, null, gtypes, handler,
         false);
     val = restoredMap.get("hello");
     AssertJUnit.assertEquals(3, val.intValue());
-    val = restoredMap.get("world"); 
+    val = restoredMap.get("world");
     AssertJUnit.assertNull(val);
     val = restoredMap.get("test");
     AssertJUnit.assertNull(val);
@@ -190,10 +189,10 @@
 
   @Test(enabled = true)
   public void testGetPutKeyDurable() throws NoSuchMethodException, ClassNotFoundException {
-    
+
     DurableType gtypes[] = {DurableType.DURABLE, DurableType.STRING};
     EntityFactoryProxy efproxies[] = {new EntityFactoryProxyHelper<Person>(Person.class)};
-    
+
     Person<Long> person =  (Person<Long>) efproxies[0].create(m_act, null, null, false);
     person.setAge((short) 31);
     person.setName("Bob", true);
@@ -203,10 +202,10 @@
     anotherPerson.setAge((short) 30);
     anotherPerson.setName("Alice", true);
 
-    DurableHashMap<Person<Long>, String> map = DurableHashMapFactory.create(m_act, 
+    DurableHashMap<Person<Long>, String> map = DurableHashMapFactory.create(m_act,
                       efproxies, gtypes, mInitialCapacity, false);
     String str = map.put(person, "hello");
-    AssertJUnit.assertNull(str); 
+    AssertJUnit.assertNull(str);
     str = map.get(person);
     AssertJUnit.assertEquals(str, "hello");
     str = map.put(person, "world");
@@ -215,12 +214,12 @@
     AssertJUnit.assertEquals(str, "world");
 
     str = map.put(anotherPerson, "testing");
-    AssertJUnit.assertNull(str); 
+    AssertJUnit.assertNull(str);
     str = map.get(anotherPerson);
     AssertJUnit.assertEquals(str, "testing");
     str = map.get(person);
     AssertJUnit.assertEquals(str, "world");
-    
+
     Person<Long> third =  (Person<Long>) efproxies[0].create(m_act, null, null, false);
     third.setAge((short) 31);
     third.setName("Bob", true);
@@ -233,14 +232,14 @@
 
   @Test(enabled = true)
   public void testGetPutValueDurable() throws NoSuchMethodException, ClassNotFoundException {
-    
+
     DurableType gtypes[] = {DurableType.STRING, DurableType.DURABLE};
     EntityFactoryProxy efproxies[] = {null, new EntityFactoryProxyHelper<Person>(Person.class)};
-    
+
     Person<Long> person =  (Person<Long>) efproxies[1].create(m_act, null, null, false);
     person.setName("Alice", false);
     person.setAge((short) 31);
-    DurableHashMap<String, Person<Long>> map = DurableHashMapFactory.create(m_act, 
+    DurableHashMap<String, Person<Long>> map = DurableHashMapFactory.create(m_act,
                             efproxies, gtypes, mInitialCapacity, false);
     map.put("hello", person);
     Person<Long> anotherPerson =  (Person<Long>) efproxies[1].create(m_act, null, null, false);
@@ -267,7 +266,7 @@
 
   @Test(enabled = true)
   public void testGetPutKeyValueDurable() throws NoSuchMethodException, ClassNotFoundException {
-    
+
     DurableType gtypes[] = {DurableType.DURABLE, DurableType.DURABLE};
     EntityFactoryProxy efproxies[] = {new EntityFactoryProxyHelper<Person>(Person.class),
         new EntityFactoryProxyHelper<Person>(Person.class)};
@@ -280,12 +279,12 @@
     anotherPerson.setAge((short) 30);
     anotherPerson.setName("Alice", true);
 
-    DurableHashMap<Person<Long>, Person<Long>> map = DurableHashMapFactory.create(m_act, 
+    DurableHashMap<Person<Long>, Person<Long>> map = DurableHashMapFactory.create(m_act,
                             efproxies, gtypes, mInitialCapacity, false);
     map.put(person, anotherPerson);
 
     Person<Long> per = map.get(person);
-    AssertJUnit.assertEquals(30, (int)per.getAge()); 
+    AssertJUnit.assertEquals(30, (int)per.getAge());
     per = map.get(anotherPerson);
     AssertJUnit.assertNull(per);
 
@@ -300,7 +299,7 @@
     EntityFactoryProxy mapefproxies[] = {null,
         new EntityFactoryProxyHelper<DurableHashMap>(DurableHashMap.class, 2), null,
         new EntityFactoryProxyHelper<Person>(Person.class)};
-    
+
     Person<Long> person =  PersonFactory.create(m_act, null, null, false);
     person.setAge((short) 31);
     person.setName("Bob", true);
@@ -309,8 +308,8 @@
     Person<Long> anotherPerson =  PersonFactory.create(m_act, null, null, false);
     anotherPerson.setAge((short) 30);
     anotherPerson.setName("Alice", true);
-    
-    DurableHashMap<String, Person<Long>> map = DurableHashMapFactory.create(m_act, 
+
+    DurableHashMap<String, Person<Long>> map = DurableHashMapFactory.create(m_act,
                             efproxies, gtypes, mInitialCapacity, false);
     map.put("world", person);
     Person<Long> per = map.get("world");
@@ -328,7 +327,7 @@
 
     bigMap.destroy();
   }
-    
+
   @Test(enabled = true)
   public void testAutoResizeMaps() {
     DurableType gtypes[] = {DurableType.STRING, DurableType.INTEGER};
@@ -352,8 +351,8 @@
     AssertJUnit.assertEquals(map.getSize(), 200);
     for (int i = 0; i < 200; i++) {
       AssertJUnit.assertEquals(map.get("str" + i).intValue(), i);
-    } 
-    DurableHashMap<String, Integer> restoredMap = DurableHashMapFactory.restore(m_act, null, gtypes, handler, 
+    }
+    DurableHashMap<String, Integer> restoredMap = DurableHashMapFactory.restore(m_act, null, gtypes, handler,
         false);
     AssertJUnit.assertEquals(restoredMap.getSize(), 200);
     for (int i = 0; i < 200; i++) {
diff --git a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashSetNGTest.java b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashSetNGTest.java
index d37c7b2..261a0a6 100644
--- a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashSetNGTest.java
+++ b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableHashSetNGTest.java
@@ -38,8 +38,6 @@
 import org.testng.AssertJUnit;
 import org.testng.Assert;
 
-import sun.misc.Unsafe;
-
 /**
  *
  *
@@ -49,7 +47,8 @@
   private long cKEYCAPACITY;
   private NonVolatileMemAllocator m_act;
   private Random rand;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
   private long initialCapacity;
 
   protected DurableBuffer<NonVolatileMemAllocator>
@@ -279,4 +278,3 @@
   }
 
 }
-
diff --git a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableTreeNGTest.java b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableTreeNGTest.java
index 7047bbb..6fb76c9 100644
--- a/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableTreeNGTest.java
+++ b/mnemonic-collections/src/test/java/org/apache/mnemonic/collections/DurableTreeNGTest.java
@@ -35,8 +35,6 @@
 import org.testng.AssertJUnit;
 //import org.testng.Assert;
 
-import sun.misc.Unsafe;
-
 /**
  *
  *
@@ -46,7 +44,8 @@
   private long cKEYCAPACITY;
   private NonVolatileMemAllocator m_act;
   private Random rand;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
 
   @BeforeClass
   public void setUp() throws Exception {
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java b/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
index fa44c62..15d27d6 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/AnnotatedDurableEntityClass.java
@@ -56,7 +56,6 @@
 import com.squareup.javapoet.TypeVariableName;
 
 import org.apache.mnemonic.resgc.ReclaimContext;
-import sun.misc.Unsafe;
 
 /**
  * this class managed to generate generic durable concrete object and their
@@ -200,7 +199,7 @@
     m_entitymtdinfo.put("initializeDurableEntity", new MethodInfo());
     m_entitymtdinfo.put("createDurableEntity", new MethodInfo());
     m_entitymtdinfo.put("restoreDurableEntity", new MethodInfo());
-    
+
     m_extramtdinfo.put("getNativeFieldInfo_static", new MethodInfo());
 
   }
@@ -210,6 +209,8 @@
     FieldInfo fieldinfo;
     String methodname;
     long fieldoff = 0;
+    AnnotationSpec unsafeannotation = AnnotationSpec.builder(SuppressWarnings.class)
+        .addMember("value", "{$S,$S}", "restriction", "UseOfSunClasses").build();
     TypeElement intf_durable = m_elemutils.getTypeElement(Durable.class.getCanonicalName());
     TypeElement intf_entity = m_elemutils.getTypeElement(MemoryDurableEntity.class.getCanonicalName());
     // System.err.printf("<><><><><> %s ======\n", intf_entity.toString());
@@ -228,8 +229,10 @@
 
     fieldinfo = new FieldInfo();
     fieldinfo.name = String.format("m_unsafe_%s", Utils.genRandomString());
-    fieldinfo.type = TypeName.get(m_elemutils.getTypeElement(Unsafe.class.getCanonicalName()).asType());
-    fieldinfo.specbuilder = FieldSpec.builder(fieldinfo.type, fieldinfo.name, Modifier.PRIVATE);
+    // fieldinfo.type = TypeName.get(m_elemutils.getTypeElement(sun.misc.Unsafe.class.getCanonicalName()).asType());
+    fieldinfo.type = ClassName.get("sun.misc", "Unsafe");
+    fieldinfo.specbuilder = FieldSpec.builder(fieldinfo.type, fieldinfo.name, Modifier.PRIVATE)
+                                     .addAnnotation(unsafeannotation);
     m_fieldsinfo.put("unsafe", fieldinfo);
 
     fieldinfo = new FieldInfo();
@@ -986,6 +989,9 @@
       fieldinfo = fieldinfos.get(name);
       if (null != fieldinfo.specbuilder) {
         typespecbuilder.addField(fieldinfo.specbuilder.build());
+        if (name.equals("unsafe")) {
+            typespecbuilder.alwaysQualify("Unsafe");
+        }
       }
     }
   }
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/GenericField.java b/mnemonic-core/src/main/java/org/apache/mnemonic/GenericField.java
index ff16435..3d22fe6 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/GenericField.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/GenericField.java
@@ -18,7 +18,6 @@
 package org.apache.mnemonic;
 
 import org.apache.mnemonic.resgc.ReclaimContext;
-import sun.misc.Unsafe;
 
 /**
  * this class defines generic field for non-volatile entity
@@ -28,7 +27,8 @@
 @SuppressWarnings("restriction")
 public class GenericField<A extends RestorableAllocator<A>, E> implements Durable {
 
-  private Unsafe m_unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe m_unsafe;
   private long m_fpos;
   private DurableType m_dgftype = null;
   private Durable m_field = null;
@@ -71,9 +71,10 @@
    *          specify the field position
    *
    */
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
   public GenericField(EntityFactoryProxy defproxy, DurableType dgftype,
       EntityFactoryProxy[] efproxies, DurableType[] gftypes,
-      A allocator, Unsafe unsafe, boolean autoreclaim, ReclaimContext rctx, Long fpos) {
+      A allocator, sun.misc.Unsafe unsafe, boolean autoreclaim, ReclaimContext rctx, Long fpos) {
     m_unsafe = unsafe;
     m_fpos = fpos;
     m_allocator = allocator;
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java b/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
index f3be4c3..368583c 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
@@ -22,8 +22,6 @@
 import org.apache.mnemonic.resgc.ResReclaim;
 import org.apache.mnemonic.resgc.ReclaimContext;
 
-import sun.misc.Unsafe;
-
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.util.Map;
@@ -42,7 +40,8 @@
 
   private boolean m_activegc = true;
   private long m_gctimeout = 100;
-  private static Unsafe m_unsafe = null;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private static sun.misc.Unsafe m_unsafe = null;
   private AtomicLong currentMemory = new AtomicLong(0L);
   private long maxStoreCapacity = 0L;
   private Map<Long, Long> m_chunksize = new ConcurrentHashMap<Long, Long>();
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/Utils.java b/mnemonic-core/src/main/java/org/apache/mnemonic/Utils.java
index bbdf778..45f07ee 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/Utils.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/Utils.java
@@ -22,7 +22,6 @@
 import org.apache.mnemonic.service.computing.GeneralComputingService;
 import org.apache.mnemonic.service.memory.NonVolatileMemoryAllocatorService;
 import org.apache.mnemonic.service.memory.VolatileMemoryAllocatorService;
-import sun.misc.Unsafe;
 
 import java.io.File;
 import java.lang.reflect.Field;
@@ -42,7 +41,7 @@
  * <p>
  * Utilities for project.
  * </p>
- * 
+ *
  */
 @SuppressWarnings("restriction")
 public class Utils {
@@ -57,7 +56,8 @@
   public static final String ANSI_CYAN = "\u001B[36m";
   public static final String ANSI_WHITE = "\u001B[37m";
 
-  private static Unsafe m_unsafe = null;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private static sun.misc.Unsafe m_unsafe = null;
 
   private static ServiceLoader<VolatileMemoryAllocatorService> m_vmasvcloader = null;
   private static ServiceLoader<NonVolatileMemoryAllocatorService> m_nvmasvcloader = null;
@@ -65,7 +65,7 @@
 
   /**
    * retrieve a volatile memory allocator service
-   * 
+   *
    * @param id
    *          specify a name of allocator to retrieve
    *
@@ -77,7 +77,7 @@
 
   /**
    * retrieve a volatile memory allocator service
-   * 
+   *
    * @param id
    *          specify a name of allocator to retrieve
    *
@@ -109,7 +109,7 @@
 
   /**
    * retrieve a non-volatile memory allocator service
-   * 
+   *
    * @param id
    *          specify a name of allocator to retrieve
    *
@@ -161,7 +161,7 @@
 
   /**
    * Generates a unique name that contains current timestamp.
-   * 
+   *
    * @param format
    *          the template that is used to generate unique name.
    *
@@ -225,7 +225,8 @@
    *
    * @return an unsafe object
    */
-  public static Unsafe getUnsafe() throws Exception {
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  public static sun.misc.Unsafe getUnsafe() throws Exception {
     if (null == m_unsafe) {
       Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
       field.setAccessible(true);
@@ -407,7 +408,7 @@
 
   /**
    * generate native form of object stack parameter frame.
-   * 
+   *
    * @param objstack
    *          a stack of object info retrieved from
    *          Durable.getNativeFieldInfo(), order matters
@@ -552,7 +553,8 @@
    * @return
    *         the address of this object
    */
-  public static long addressOf(Unsafe unsafe, Object o) {
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  public static long addressOf(sun.misc.Unsafe unsafe, Object o) {
     Object[] array = new Object[] {o};
 
     long baseOffset = unsafe.arrayBaseOffset(Object[].class);
diff --git a/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonNGTest.java b/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonNGTest.java
index 785e8a3..35548c1 100644
--- a/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonNGTest.java
+++ b/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonNGTest.java
@@ -33,15 +33,14 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import sun.misc.Unsafe;
-
 @SuppressWarnings("restriction")
 public class DurablePersonNGTest {
   private long cKEYCAPACITY;
   private long pic_checksum;
   private long fp_checksum;
   private Random rand;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
 
   protected DurableBuffer<NonVolatileMemAllocator>
       genuptBuffer(NonVolatileMemAllocator act, Checksum cs, int size) {
@@ -83,7 +82,7 @@
     rand = Utils.createRandom();
     unsafe = Utils.getUnsafe();
   }
-  
+
   @Test(expectedExceptions = { OutOfHybridMemory.class })
   public void testGenPeople() throws OutOfHybridMemory, RetrieveDurableEntityError {
     Random rand = Utils.createRandom();
diff --git a/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonRefBreakNGTest.java b/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonRefBreakNGTest.java
index 2ff5b48..9779725 100644
--- a/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonRefBreakNGTest.java
+++ b/mnemonic-core/src/test/java/org/apache/mnemonic/DurablePersonRefBreakNGTest.java
@@ -28,8 +28,6 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import sun.misc.Unsafe;
-
 @SuppressWarnings("restriction")
 public class DurablePersonRefBreakNGTest {
     public static String uri = "./pobj_person_refbreak.dat";
@@ -37,7 +35,8 @@
     private long pic_checksum;
     private long fp_checksum;
     private Random rand;
-    private Unsafe unsafe;
+    @SuppressWarnings({"restriction", "UseOfSunClasses"})
+    private sun.misc.Unsafe unsafe;
 
     protected DurableBuffer<NonVolatileMemAllocator>
     genuptBuffer(NonVolatileMemAllocator act, Checksum cs, int size) {
diff --git a/mnemonic-examples/src/main/java/org/apache/mnemonic/examples/Main.java b/mnemonic-examples/src/main/java/org/apache/mnemonic/examples/Main.java
index f9d73a5..ecb3864 100644
--- a/mnemonic-examples/src/main/java/org/apache/mnemonic/examples/Main.java
+++ b/mnemonic-examples/src/main/java/org/apache/mnemonic/examples/Main.java
@@ -29,11 +29,9 @@
 import org.apache.mnemonic.SysMemAllocator;
 import org.apache.mnemonic.Utils;
 
-import sun.misc.Unsafe;
-
 /**
  * Main is the class of example.
- * 
+ *
  */
 @SuppressWarnings("restriction")
 public class Main {
@@ -164,7 +162,8 @@
      */
     System.out.println(Utils.ANSI_GREEN + "[[Demo Allocation, Auto Destruction "
         + "and Manual Destruction of Big Memory Chunk.]]" + Utils.ANSI_RESET);
-    Unsafe unsafe = Utils.getUnsafe();
+    @SuppressWarnings({"restriction", "UseOfSunClasses"})
+    sun.misc.Unsafe unsafe = Utils.getUnsafe();
     MemChunkHolder<?> mch;
     for (int idx = 1; idx <= 50; ++idx) {
       int size = randomGenerator.nextInt(1024 * 1024) + 1024 * 1024;
diff --git a/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapred/MneMapredChunkDataTest.java b/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapred/MneMapredChunkDataTest.java
index 521eca7..41a4d71 100644
--- a/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapred/MneMapredChunkDataTest.java
+++ b/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapred/MneMapredChunkDataTest.java
@@ -47,7 +47,6 @@
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
-import sun.misc.Unsafe;
 
 import java.io.File;
 import java.io.IOException;
@@ -74,7 +73,8 @@
   private long m_reccnt = 5000L;
   private volatile long m_checksum;
   private volatile long m_totalsize = 0L;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
 
   @BeforeClass
   public void setUp() throws Exception {
diff --git a/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapreduce/MneMapreduceChunkDataTest.java b/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapreduce/MneMapreduceChunkDataTest.java
index 2a8d818..e722ccb 100644
--- a/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapreduce/MneMapreduceChunkDataTest.java
+++ b/mnemonic-hadoop/mnemonic-hadoop-mapreduce/src/test/java/org/apache/mnemonic/mapreduce/MneMapreduceChunkDataTest.java
@@ -57,8 +57,6 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import sun.misc.Unsafe;
-
 @SuppressWarnings("restriction")
 public class MneMapreduceChunkDataTest {
 
@@ -75,7 +73,8 @@
   private long m_reccnt = 5000L;
   private volatile long m_checksum;
   private volatile long m_totalsize = 0L;
-  private Unsafe unsafe;
+  @SuppressWarnings({"restriction", "UseOfSunClasses"})
+  private sun.misc.Unsafe unsafe;
 
   @BeforeClass
   public void setUp() throws Exception {
diff --git a/pom.xml b/pom.xml
index 1f989a7..b7922d1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -145,7 +145,7 @@
       <dependency>
         <groupId>com.squareup</groupId>
         <artifactId>javapoet</artifactId>
-        <version>1.11.1</version>
+        <version>1.13.0</version>
       </dependency>
       <!-- logging dependencies -->
       <dependency>