PIOTEAM-41 eventtime.
diff --git a/examples/event_sample.py b/examples/event_sample.py
index a2de24c..45e5afc 100644
--- a/examples/event_sample.py
+++ b/examples/event_sample.py
@@ -1,5 +1,7 @@
 from predictionio import EventClient
 from predictionio import NotFoundError
+from datetime import datetime
+import pytz
 
 client = EventClient(app_id=6, url="http://localhost:7070")
 
@@ -92,6 +94,13 @@
 print("Delete user")
 print(client.delete_user("foo"))
 
+# The SDK also support specifying the eventTime. It is useful for importing 
+# events happened in the past.
+#foo_time = datetime(2014, 8, 31, 4, 56, 1, 2, tzinfo=pytz.timezone('US/Pacific'))
+foo_time = datetime(2014, 8, 31, 4, 56, tzinfo=pytz.timezone('US/Pacific'))
+print("Create user at " + str(foo_time))
+print(client.set_user("Jarvis", {}, foo_time))
+
 # "item"-helper methods
 
 # Set item properties implicitly create a item
diff --git a/predictionio/__init__.py b/predictionio/__init__.py
index eee7ebb..3d8eca1 100644
--- a/predictionio/__init__.py
+++ b/predictionio/__init__.py
@@ -26,17 +26,25 @@
 import urllib
 
 from datetime import datetime
+import pytz
 
 from predictionio.connection import Connection
 from predictionio.connection import AsyncRequest
 from predictionio.connection import PredictionIOAPIError
 
+
 class NotCreatedError(PredictionIOAPIError):
   pass
 
+
 class NotFoundError(PredictionIOAPIError):
   pass
 
+
+def now_if_none(t):
+  return datetime.now(pytz.utc) if t is None else t
+
+
 class BaseClient(object):
   def __init__(self, url, threads=1, qsize=0, timeout=5):
     """Constructor of Client object.
@@ -139,6 +147,7 @@
     self.app_id = app_id
 
   def acreate_event(self, data):
+    print data
     path = "/events.json"
     request = AsyncRequest("POST", path, **data)
     request.set_rfunc(self._acreate_resp)
@@ -170,82 +179,100 @@
   def delete_event(self, event_id):
     return self.adelete_event(event_id).get_response()
 
-  def aset_user(self, uid, properties={}):
+  ## Below are helper functions
+  
+  def aset_user(self, uid, properties={}, eventTime=None):
+    eventTime = now_if_none(eventTime)
+
     """set properties of an user"""
     return self.acreate_event({
       "event" : "$set",
       "entityType" : "pio_user",
       "entityId" : uid,
       "properties" : properties,
-      "appId" : self.app_id
+      "appId" : self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
-  
-  def set_user(self, uid, properties={}):
-    return self.aset_user(uid, properties).get_response()
 
-  def aunset_user(self, uid, properties):
+  def set_user(self, uid, properties={}, eventTime=None):
+    return self.aset_user(uid, properties, eventTime).get_response()
+
+  def aunset_user(self, uid, properties, eventTime=None):
     """unset properties of an user"""
+    eventTime = now_if_none(eventTime)
+
     # check properties={}, it cannot be empty
     return self.acreate_event({
       "event" : "$unset",
       "entityType" : "pio_user",
       "entityId" : uid,
       "properties" : properties,
-      "appId" : self.app_id
+      "appId" : self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
   
-  def unset_user(self, uid, properties):
-    return self.aunset_user(uid, properties).get_response()
+  def unset_user(self, uid, properties, eventTime=None):
+    return self.aunset_user(uid, properties, eventTime).get_response()
   
-  def adelete_user(self, uid):
+  def adelete_user(self, uid, eventTime=None):
     """set properties of an user"""
+    eventTime = now_if_none(eventTime)
     return self.acreate_event({
       "event" : "$delete",
       "entityType" : "pio_user",
       "entityId" : uid,
       "appId": self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
   
-  def delete_user(self, uid):
-    return self.adelete_user(uid).get_response()
+  def delete_user(self, uid, eventTime=None):
+    return self.adelete_user(uid, eventTime).get_response()
 
-  def aset_item(self, iid, properties={}):
+  def aset_item(self, iid, properties={}, eventTime=None):
+    eventTime = now_if_none(eventTime)
     return self.acreate_event({
       "event" : "$set",
       "entityType" : "pio_item",
       "entityId" : iid,
       "properties" : properties,
-      "appId" : self.app_id
+      "appId" : self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
   
-  def set_item(self, iid, properties={}):
+  def set_item(self, iid, properties={}, eventTime=None):
     return self.aset_item(iid, properties).get_response()
 
-  def aunset_item(self, iid, properties={}):
+  def aunset_item(self, iid, properties={}, eventTime=None):
+    eventTime = now_if_none(eventTime)
     return self.acreate_event({
       "event" : "$unset",
       "entityType" : "pio_item",
       "entityId" : iid,
       "properties" : properties,
-      "appId" : self.app_id
+      "appId" : self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
   
-  def unset_item(self, iid, properties={}):
-    return self.aunset_item(iid, properties).get_response()
+  def unset_item(self, iid, properties={}, eventTime=None):
+    return self.aunset_item(iid, properties, eventTime).get_response()
   
-  def adelete_item(self, iid):
+  def adelete_item(self, iid, eventTime=None):
     """set properties of an user"""
+    eventTime = now_if_none(eventTime)
     return self.acreate_event({
       "event" : "$delete",
       "entityType" : "pio_item",
       "entityId" : iid,
       "appId": self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
   
-  def delete_item(self, iid):
-    return self.adelete_item(iid).get_response()
+  def delete_item(self, iid, eventTime=None):
+    return self.adelete_item(iid, eventTime).get_response()
 
-  def arecord_user_action_on_item(self, action, uid, iid, properties={}):
+  def arecord_user_action_on_item(self, action, uid, iid, properties={},
+      eventTime=None):
+    eventTime = now_if_none(eventTime)
     return self.acreate_event({
       "event" : action,
       "entityType" : "pio_user",
@@ -253,12 +280,14 @@
       "targetEntityType" : "pio_item",
       "targetEntityId": iid,
       "properties" : properties,
-      "appId" : self.app_id
+      "appId" : self.app_id,
+      "eventTime": eventTime.isoformat(),
     })
 
-  def record_user_action_on_item(self, action, uid, iid, properties={}):
+  def record_user_action_on_item(self, action, uid, iid, properties={},
+      eventTime=None):
     return self.arecord_user_action_on_item(
-      action, uid, iid, properties).get_response()
+      action, uid, iid, properties, eventTime).get_response()
 
 
 class PredictionClient(BaseClient):