diff --git a/daemon/daemon.cc b/daemon/daemon.cc
index 5b953d3..ae41418 100644
--- a/daemon/daemon.cc
+++ b/daemon/daemon.cc
@@ -23,6 +23,7 @@
 #include <iostream>
 #include <Ice/Service.h>
 #include <Ice/Identity.h>
+#include <ccnx-wrapper.h>
 
 #include "notify-i.h"
 #include <boost/make_shared.hpp>
@@ -30,6 +31,7 @@
 using namespace std;
 using namespace boost;
 using namespace ChronoshareClient;
+using namespace Ccnx;
 
 typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str; 
 
@@ -70,7 +72,8 @@
   try
     {
       // DbHelper db ("./", "/ndn/ucla.edu/alex");
-      ActionLogPtr actionLog = make_shared<ActionLog> ("./", "/ndn/ucla.edu/alex");
+      CcnxWrapperPtr ccnx = make_shared<CcnxWrapper> ();
+      ActionLogPtr actionLog = make_shared<ActionLog> (ccnx, "./", "/ndn/ucla.edu/alex", "shared");
 
       MyService svc (actionLog);
       status = svc.main (argc, argv);
diff --git a/include/ccnx-name.h b/include/ccnx-name.h
index 5f5a5c0..a6b6228 100644
--- a/include/ccnx-name.h
+++ b/include/ccnx-name.h
@@ -85,6 +85,22 @@
   Name &
   appendComp(const string &compStr);
 
+  Name &
+  appendComp(const Name &name);
+
+  Name &
+  appendComp(const void *buf, size_t size); 
+
+  /**
+   * Append int component
+   *
+   * Difference between this and appendComp call is that data is appended in network order
+   *
+   * Also, this function honors naming convention (%00 prefix is added)
+   */
+  Name &
+  appendComp(uint64_t number);
+  
   int
   size() const {return m_comps.size();}
 
@@ -97,6 +113,9 @@
   string
   getCompAsString(int index) const;
 
+  uint64_t
+  getCompAsInt (int index) const;
+
   Name
   getPartialName(int start, int n = -1) const;
 
diff --git a/src/action-log.cc b/src/action-log.cc
index c63424d..ff8e257 100644
--- a/src/action-log.cc
+++ b/src/action-log.cc
@@ -24,9 +24,12 @@
 
 using namespace boost;
 using namespace std;
+using namespace Ccnx;
 
-ActionLog::ActionLog (const std::string &path, const std::string &localName)
+ActionLog::ActionLog (Ccnx::CcnxWrapperPtr ccnx, const std::string &path, const std::string &localName, const std::string &sharedFolder)
   : SyncLog (path, localName)
+  , m_ccnx (ccnx)
+  , m_sharedFolderName (sharedFolder)
 {
   int res = sqlite3_create_function (m_db, "apply_action", -1, SQLITE_ANY, reinterpret_cast<void*> (this),
                                  ActionLog::apply_action_xFun,
@@ -163,8 +166,8 @@
 
   if (parent_device_id > 0 && parent_seq_no > 0)
     {
-      cout << Ccnx::Name (reinterpret_cast<const unsigned char *> (parent_device_name.c_str ()),
-                          parent_device_name.size ()) << endl;
+      cout << Name (reinterpret_cast<const unsigned char *> (parent_device_name.c_str ()),
+                    parent_device_name.size ()) << endl;
       
       item.set_parent_device_name (parent_device_name);
       item.set_parent_seq_no (parent_seq_no);
@@ -222,10 +225,7 @@
 
   sqlite3_bind_int64 (stmt, 7, parent_device_id);
   sqlite3_bind_int64 (stmt, 8, parent_seq_no);
-  
-  sqlite3_step (stmt);
 
-  // missing part: creating ContentObject for the action !!!
 
   ActionItem item;
   item.set_action (ActionItem::UPDATE);
@@ -235,8 +235,25 @@
   item.set_parent_device_name (parent_device_name);
   item.set_parent_seq_no (parent_seq_no);
 
-  cout << Ccnx::Name (reinterpret_cast<const unsigned char *> (parent_device_name.c_str ()),
-                      parent_device_name.size ()) << endl;
+  string item_msg;
+  item.SerializeToString (&item_msg);
+  Name actionName (m_localName);
+  actionName
+    .appendComp ("action")
+    .appendComp (m_sharedFolderName)
+    .appendComp (reinterpret_cast<void*> (seq_no), sizeof (seq_no));
+  
+  // Bytes actionData = m_ccnx->createContentObject (?name, item_msg.c_str (), item_msg.size ());
+
+  
+  // sqlite3_bind_blob (stmt, 10, item_msg.c_str (), item_msg.size (), SQLITE_TRANSIENT);
+  
+  sqlite3_step (stmt);
+
+
+  
+  // cout << Ccnx::Name (reinterpret_cast<const unsigned char *> (parent_device_name.c_str ()),
+  //                     parent_device_name.size ()) << endl;
   
   // assign name to the action, serialize action, and create content object
   
diff --git a/src/action-log.h b/src/action-log.h
index f6cc0a7..323f6a3 100644
--- a/src/action-log.h
+++ b/src/action-log.h
@@ -24,6 +24,7 @@
 
 #include "sync-log.h"
 #include <boost/tuple/tuple.hpp>
+#include <ccnx-wrapper.h>
 
 class ActionLog;
 typedef boost::shared_ptr<ActionLog> ActionLogPtr;
@@ -31,7 +32,7 @@
 class ActionLog : public SyncLog
 {
 public:
-  ActionLog (const std::string &path, const std::string &localName);
+  ActionLog (Ccnx::CcnxWrapperPtr ccnx, const std::string &path, const std::string &localName, const std::string &sharedFolder);
 
   void
   AddActionUpdate (const std::string &filename,
@@ -52,7 +53,9 @@
   static void
   apply_action_xFun (sqlite3_context *context, int argc, sqlite3_value **argv);
   
-protected:
+private:
+  Ccnx::CcnxWrapperPtr m_ccnx;
+  Ccnx::Name m_sharedFolderName;
 };
 
 #endif // ACTION_LOG_H
diff --git a/src/ccnx-name.cpp b/src/ccnx-name.cpp
index 3803987..28761dd 100644
--- a/src/ccnx-name.cpp
+++ b/src/ccnx-name.cpp
@@ -165,10 +165,59 @@
 Name::appendComp(const string &compStr)
 {
   Bytes comp(compStr.begin(), compStr.end());
-  appendComp(comp);
+  return appendComp(comp);
+}
+
+Name &
+Name::appendComp(const Name &name)
+{
+  for (vector<Bytes>::const_iterator i = name.m_comps.begin (); i != name.m_comps.end (); i++)
+    {
+      appendComp (*i);
+    }
   return *this;
 }
 
+Name &
+Name::appendComp (const void *buf, size_t size)
+{
+  Bytes comp (reinterpret_cast<const unsigned char*> (buf), reinterpret_cast<const unsigned char*> (buf) + size);
+  return appendComp(comp);
+}
+
+Name &
+Name::appendComp(uint64_t number)
+{
+  Bytes comp;
+  comp.push_back (0);
+  
+  while (number > 0)
+    {
+      comp.push_back (static_cast<unsigned char> (number & 0xFF));
+      number >>= 8;
+    }
+  return appendComp (comp);
+}
+
+uint64_t
+Name::getCompAsInt (int index) const
+{
+  Bytes comp = getComp(index);
+  if (comp.size () < 1 ||
+      comp[0] != 0)
+    {
+      boost::throw_exception(NameException()
+                             << error_info_str("Non integer component: " + getCompAsString(index)));
+    }
+  uint64_t ret = 0;
+  for (int i = comp.size () - 1; i >= 1; i--)
+    {
+      ret <<= 8;
+      ret |= comp [i];
+    }
+  return ret;
+}
+
 Bytes
 Name::getComp(int index) const
 {
@@ -194,7 +243,7 @@
     }
     else
     {
-      ss << "%" << hex << setfill('0') << setw(2) << ch;
+      ss << "%" << hex << setfill('0') << setw(2) << (unsigned int)ch;
     }
   }
 
diff --git a/test/test-ccnx-name.cc b/test/test-ccnx-name.cc
index f617397..a876ba4 100644
--- a/test/test-ccnx-name.cc
+++ b/test/test-ccnx-name.cc
@@ -30,6 +30,19 @@
   BOOST_CHECK_EQUAL(empty, name);
   BOOST_CHECK_EQUAL(name, Name("/hello") + Name("/world"));
 
+
+  name.appendComp (1);
+  name.appendComp (255);
+  name.appendComp (256);
+  name.appendComp (1234567890);
+
+  BOOST_CHECK_EQUAL (name.toString (), "/hello/world/%00%01/%00%ff/%00%00%01/%00%d2%02%96I");
+
+  BOOST_CHECK_EQUAL (name.getCompAsInt (5), 1234567890);
+  BOOST_CHECK_EQUAL (name.getCompAsInt (4), 256);
+  BOOST_CHECK_EQUAL (name.getCompAsInt (3), 255);
+  BOOST_CHECK_EQUAL (name.getCompAsInt (2), 1);
+  
   // Charbuf related stuff will be checked in other place
 }
 
