diff --git a/apps/ndn-consumer-zipf-mandelbrot.cc b/apps/ndn-consumer-zipf-mandelbrot.cc
index d744143..1fc8d45 100644
--- a/apps/ndn-consumer-zipf-mandelbrot.cc
+++ b/apps/ndn-consumer-zipf-mandelbrot.cc
@@ -24,7 +24,6 @@
 #include "ns3/ndn-interest.h"
 #include "ns3/ndn-content-object.h"
 #include <math.h>
-//#include <random-variable.h>
 
 
 NS_LOG_COMPONENT_DEFINE ("ndn.ConsumerZipfMandelbrot");
@@ -41,18 +40,22 @@
     .SetGroupName ("Ndn")
     .SetParent<ConsumerCbr> ()
     .AddConstructor<ConsumerZipfMandelbrot> ()
-    .AddAttribute ("N", "Number of the Contents in total",
-                      StringValue ("100"),
-                      MakeUintegerAccessor (&ConsumerZipfMandelbrot::m_N),
-                      MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("q", "parameter of improve rank",
-                      StringValue ("0.7"),
-                      MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_q),
-                      MakeDoubleChecker<double>())
-	  .AddAttribute ("s", "parameter of power",
-							StringValue ("0.7"),
-							MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_s),
-							MakeDoubleChecker<double>())
+
+    .AddAttribute ("NumberOfContents", "Number of the Contents in total",
+                   StringValue ("100"),
+                   MakeUintegerAccessor (&ConsumerZipfMandelbrot::SetNumberOfContents, &ConsumerZipfMandelbrot::GetNumberOfContents),
+                   MakeUintegerChecker<uint32_t> ())
+
+    // Alex: q and s are not yet really working
+    //
+    // .AddAttribute ("q", "parameter of improve rank",
+    //                StringValue ("0.7"),
+    //                MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_q),
+    //                MakeDoubleChecker<double>())
+    // .AddAttribute ("s", "parameter of power",
+    //                StringValue ("0.7"),
+    //                MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_s),
+    //                MakeDoubleChecker<double>())
     ;
 
   return tid;
@@ -60,149 +63,162 @@
 
 
 ConsumerZipfMandelbrot::ConsumerZipfMandelbrot()
-	: m_N(100)
-	, m_q (0.7)
-	, m_s (0.7)
+  : m_q (0.7)
+  , m_s (0.7)
+  , m_SeqRng (0.0, 1.0)
 {
-	m_Pcum = new double[m_N+1];
-	m_Pcum[0] = 0.0;
-	for (uint32_t i=1; i<=m_N; i++) {
-		m_Pcum[i] = m_Pcum[i-1] + 1.0/pow(i+m_q, m_s);
-	}
-	for (uint32_t i=1; i<=m_N; i++) {
-		m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
-		NS_LOG_LOGIC("cum Probability ["<<i<<"]="<<m_Pcum[i]);
-	}
-	//Ptr<UniformRandomVariable> m_SeqRng = CreateObject<UniformRandomVariable> ();
-	m_SeqRng = new UniformVariable(0.0, 1.0); //[1, m_N+1)
-	//m_SeqRng = new UniformVariable ();
+  // SetNumberOfContents is called by NS-3 object system during the initialization
 }
 
-ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot() {
-	if (m_Pcum) {
-		delete m_Pcum;
-		m_Pcum = NULL;
-	}
-//	if (m_SeqRng) {
-//		delete m_SeqRng;
-//		m_SeqRng = NULL;
-//	}
+ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot()
+{
 }
 
 void
+ConsumerZipfMandelbrot::SetNumberOfContents (uint32_t numOfContents)
+{
+  m_N = numOfContents;
+
+  m_Pcum = std::vector<double> (m_N + 1);
+
+  m_Pcum[0] = 0.0;
+  for (uint32_t i=1; i<=m_N; i++)
+    {
+      m_Pcum[i] = m_Pcum[i-1] + 1.0/pow(i+m_q, m_s);
+    }
+  
+  for (uint32_t i=1; i<=m_N; i++)
+    {
+      m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
+      NS_LOG_LOGIC("cum Probability ["<<i<<"]="<<m_Pcum[i]);
+  }
+}
+
+uint32_t
+ConsumerZipfMandelbrot::GetNumberOfContents () const
+{
+  return m_N;
+}
+
+
+void
 ConsumerZipfMandelbrot::SendPacket() {
-	  if (!m_active) return;
+  if (!m_active) return;
 
-	  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION_NOARGS ();
 
-	  uint32_t seq=std::numeric_limits<uint32_t>::max (); //invalid
+  uint32_t seq=std::numeric_limits<uint32_t>::max (); //invalid
 
-	  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
 
-	  while (m_retxSeqs.size ())
-	    {
-	      seq = *m_retxSeqs.begin ();
-	      m_retxSeqs.erase (m_retxSeqs.begin ());
+  while (m_retxSeqs.size ())
+    {
+      seq = *m_retxSeqs.begin ();
+      m_retxSeqs.erase (m_retxSeqs.begin ());
 
-	      // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
-	      // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
-	      //   {
+      // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
+      // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
+      //   {
 
-	      //     NS_LOG_DEBUG ("Expire " << seq);
-	      //     m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired sequence number
-	      //     continue;
-	      //   }
-	      NS_LOG_DEBUG("=interest seq "<<seq<<" from m_retxSeqs");
-	      break;
-	    }
+      //     NS_LOG_DEBUG ("Expire " << seq);
+      //     m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired sequence number
+      //     continue;
+      //   }
+      NS_LOG_DEBUG("=interest seq "<<seq<<" from m_retxSeqs");
+      break;
+    }
 
-	  if (seq == std::numeric_limits<uint32_t>::max ()) //no retransmission
-	    {
-	      if (m_seqMax != std::numeric_limits<uint32_t>::max ())
-	        {
-	          if (m_seq >= m_seqMax)
-	            {
-	              return; // we are totally done
-	            }
-	        }
+  if (seq == std::numeric_limits<uint32_t>::max ()) //no retransmission
+    {
+      if (m_seqMax != std::numeric_limits<uint32_t>::max ())
+        {
+          if (m_seq >= m_seqMax)
+            {
+              return; // we are totally done
+            }
+        }
 
-	      seq = ConsumerZipfMandelbrot::GetNextSeq();
-	      m_seq ++;
-	    }
+      seq = ConsumerZipfMandelbrot::GetNextSeq();
+      m_seq ++;
+    }
 
-	  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
+  // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
 
-	  //
-	  Ptr<NameComponents> nameWithSequence = Create<NameComponents> (m_interestName);
-	  (*nameWithSequence) (seq);
-	  //
+  //
+  Ptr<NameComponents> nameWithSequence = Create<NameComponents> (m_interestName);
+  (*nameWithSequence) (seq);
+  //
 
-	  InterestHeader interestHeader;
-	  interestHeader.SetNonce               (m_rand.GetValue ());
-	  interestHeader.SetName                (nameWithSequence);
+  InterestHeader interestHeader;
+  interestHeader.SetNonce (m_rand.GetValue ());
+  interestHeader.SetName  (nameWithSequence);
 
-	  // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
-	  NS_LOG_INFO ("> Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
+  // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
+  NS_LOG_INFO ("> Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
 
-	  Ptr<Packet> packet = Create<Packet> ();
+  Ptr<Packet> packet = Create<Packet> ();
 
-	  //NS_LOG_DEBUG ("= Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
-	  packet->AddHeader (interestHeader);
-	  //NS_LOG_DEBUG ("Interest packet size: " << packet->GetSize ());
+  //NS_LOG_DEBUG ("= Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
+  packet->AddHeader (interestHeader);
+  //NS_LOG_DEBUG ("Interest packet size: " << packet->GetSize ());
 
-	  NS_LOG_DEBUG ("Trying to add " << seq << " with " << Simulator::Now () << ". already " << m_seqTimeouts.size () << " items");
+  NS_LOG_DEBUG ("Trying to add " << seq << " with " << Simulator::Now () << ". already " << m_seqTimeouts.size () << " items");
 
-	  m_seqTimeouts.insert (SeqTimeout (seq, Simulator::Now ()));
-	  m_seqLifetimes.insert (SeqTimeout (seq, Simulator::Now () + m_interestLifeTime)); // only one insert will work. if entry exists, nothing will happen... nothing should happen
-	  m_transmittedInterests (&interestHeader, this, m_face);
+  m_seqTimeouts.insert (SeqTimeout (seq, Simulator::Now ()));
+  m_seqLifetimes.insert (SeqTimeout (seq, Simulator::Now () + m_interestLifeTime)); // only one insert will work. if entry exists, nothing will happen... nothing should happen
+  m_transmittedInterests (&interestHeader, this, m_face);
 
-	  m_rtt->SentSeq (SequenceNumber32 (seq), 1);
+  m_rtt->SentSeq (SequenceNumber32 (seq), 1);
 
-	  m_protocolHandler (packet);
+  m_protocolHandler (packet);
 
-	 ConsumerZipfMandelbrot::ScheduleNextPacket ();
+  ConsumerZipfMandelbrot::ScheduleNextPacket ();
 }
 
 
 uint32_t
-ConsumerZipfMandelbrot::GetNextSeq(){
-	uint32_t content_index = 1; //[1, m_N]
-	double p_sum = 0;
+ConsumerZipfMandelbrot::GetNextSeq()
+{
+  uint32_t content_index = 1; //[1, m_N]
+  double p_sum = 0;
 
-	double p_random = m_SeqRng->GetValue();
-	while (p_random == 0){
-		p_random = m_SeqRng->GetValue();
-	}
-	//if (p_random == 0)
-	NS_LOG_LOGIC("p_random="<<p_random);
-	for (uint32_t i=1; i<=m_N; i++) {
-		p_sum = m_Pcum[i];   //m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0;   e.g.: p_cum[1] = p[1], p_cum[2] = p[1] + p[2]
-		if (p_random <= p_sum) {
-			content_index = i;
-			break;
-		} //if
-	} //for
-	//content_index = 1;
-	NS_LOG_DEBUG("RandomNumber="<<content_index);
-	return content_index;
+  double p_random = m_SeqRng.GetValue();
+  while (p_random == 0)
+    {
+      p_random = m_SeqRng.GetValue();
+    }
+  //if (p_random == 0)
+  NS_LOG_LOGIC("p_random="<<p_random);
+  for (uint32_t i=1; i<=m_N; i++)
+    {
+      p_sum = m_Pcum[i];   //m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0;   e.g.: p_cum[1] = p[1], p_cum[2] = p[1] + p[2]
+      if (p_random <= p_sum)
+        {
+          content_index = i;
+          break;
+        } //if
+    } //for
+  //content_index = 1;
+  NS_LOG_DEBUG("RandomNumber="<<content_index);
+  return content_index;
 }
 
 void
 ConsumerZipfMandelbrot::ScheduleNextPacket() {
 
-	  if (m_firstTime)
-	    {
-	      m_sendEvent = Simulator::Schedule (Seconds (0.0),
-	                                         &ConsumerZipfMandelbrot::SendPacket, this);
-	      m_firstTime = false;
-	    }
-	  else if (!m_sendEvent.IsRunning ())
-	    m_sendEvent = Simulator::Schedule (
-	                                       (m_random == 0) ?
-	                                         Seconds(1.0 / m_frequency)
-	                                       :
-	                                         Seconds(m_random->GetValue ()),
-	                                       &ConsumerZipfMandelbrot::SendPacket, this);
+  if (m_firstTime)
+    {
+      m_sendEvent = Simulator::Schedule (Seconds (0.0),
+                                         &ConsumerZipfMandelbrot::SendPacket, this);
+      m_firstTime = false;
+    }
+  else if (!m_sendEvent.IsRunning ())
+    m_sendEvent = Simulator::Schedule (
+                                       (m_random == 0) ?
+                                       Seconds(1.0 / m_frequency)
+                                       :
+                                       Seconds(m_random->GetValue ()),
+                                       &ConsumerZipfMandelbrot::SendPacket, this);
 }
 
 } /* namespace ndn */
