merge with lena-pem for moving from BuildingsMobilityModel to MobilityBuildingInfo
authorMarco Miozzo <marco.miozzo@cttc.es>
Tue, 04 Jun 2013 17:20:40 +0200
changeset 10085 048edf672cef
parent 10079 76786fb7eef1 (current diff)
parent 10084 494da2b1cdbe (diff)
child 10086 7fa6d3329928
child 10241 a3d6e3af0a4b
merge with lena-pem for moving from BuildingsMobilityModel to MobilityBuildingInfo
src/buildings/model/buildings-mobility-model.cc
src/buildings/model/buildings-mobility-model.h
src/lte/examples/lena-dual-stripe.cc
--- a/src/buildings/doc/source/buildings-design.rst	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/doc/source/buildings-design.rst	Tue Jun 04 17:20:40 2013 +0200
@@ -12,7 +12,7 @@
 The Buildings module provides:
 
  #. a new class (``Building``) that models the presence of a building in a simulation scenario;  
- #. a new mobility model (``BuildingsMobilityModel``) that allows to specify the location, size and characteristics of buildings present in the simulated area, and allows the placement of nodes inside those buildings;
+ #. a new class (``MobilityBuildingInfo``) that allows to specify the location, size and characteristics of buildings present in the simulated area, and allows the placement of nodes inside those buildings;
  #. a container class with the definition of the most useful pathloss models and the correspondent variables called ``BuildingsPropagationLossModel``.
  #. a new propagation model (``HybridBuildingsPropagationLossModel``) working with the mobility model just introduced, that allows to model the phenomenon of indoor/outdoor propagation in the presence of buildings.
  #. a simplified model working only with Okumura Hata (``OhBuildingsPropagationLossModel``) considering the phenomenon of indoor/outdoor propagation in the presence of buildings.
@@ -62,10 +62,10 @@
 
 
 
-The BuildingsMobilityModel class
-++++++++++++++++++++++++++++++++
+The MobilityBuildingInfo class
+++++++++++++++++++++++++++++++
 
-The ``BuildingsMobilityModel`` class, which inherits from the ns3 class ``MobilityModel``, is in charge of managing the standard mobility functionalities plus providing information about the position of a node with respect to building. The information managed by ``BuildingsMobilityModel`` is:
+The ``MobilityBuildingInfo`` class, which inherits from the ns3 class ``Object``, is in charge of maintaining information about the position of a node with respect to building. The information managed by ``MobilityBuildingInfo`` is:
 
   * whether the node is indoor or outdoor
   * if indoor:
@@ -73,7 +73,9 @@
     * in which building the node is
     * in which room the node is positioned (x, y and floor room indices)  
 
-The class ``BuildingsMobilityModel`` is used by ``BuildingsPropagationLossModel`` class, which inherits from the ns3 class ``PropagationLossModel`` and manages the pathloss computation of the single components and their composition according to the nodes' positions. Moreover, it implements also the shadowing, that is the loss due to obstacles in the main path (i.e., vegetation, buildings, etc.).
+The class ``MobilityBuildingInfo`` is used by ``BuildingsPropagationLossModel`` class, which inherits from the ns3 class ``PropagationLossModel`` and manages the pathloss computation of the single components and their composition according to the nodes' positions. Moreover, it implements also the shadowing, that is the loss due to obstacles in the main path (i.e., vegetation, buildings, etc.).
+
+It is to be noted that, ``MobilityBuildingInfo`` can be used by any other propagation model. However, based on the information at the time of this writing, only the ones defined in the building module are designed for considering the constraints introduced by the buildings.
 
 
 
--- a/src/buildings/doc/source/buildings-user.rst	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/doc/source/buildings-user.rst	Tue Jun 04 17:20:40 2013 +0200
@@ -42,6 +42,10 @@
 The simple ``OhBuildingMobilityLossModel`` overcome this problem by using only the Okumura Hata model and the wall penetration losses.
 
 
+Helper Functionalities
+----------------------
+
+The ``BuildingsHelper`` class defines a set of static function for assisting in the definition of the scenario with building module. In detail, it provides the method ``Install`` for installing the building information included in  ``MobilityBuildingInfo`` to a specific node (or set of nodes, i.e.,  the ``NodeContainer``). In order to synchronize the nodes information with their position, this helper provides the function ``MakeMobilityModelConsistent`` that puts all the ``Node``s presents in the simulation in the right position (i.e., outdoor or indoor, in the latter also updating in terms of building, floor and room number).
 
 
 
@@ -49,3 +53,5 @@
 
 
 
+
+
--- a/src/buildings/examples/buildings-pathloss-profiler.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/examples/buildings-pathloss-profiler.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -25,6 +25,7 @@
 #include "ns3/config-store.h"
 #include <ns3/buildings-helper.h>
 #include <ns3/hybrid-buildings-propagation-loss-model.h>
+#include <ns3/constant-position-mobility-model.h>
 
 #include <iomanip>
 #include <string>
@@ -64,7 +65,7 @@
     NS_FATAL_ERROR ("Can't open output file");
   }
   
-  Ptr<BuildingsMobilityModel> mmEnb = CreateObject<BuildingsMobilityModel> ();
+  Ptr<ConstantPositionMobilityModel> mmEnb = CreateObject<ConstantPositionMobilityModel> ();
   mmEnb->SetPosition (Vector (0.0, 0.0, hEnb));
   if (enbIndoor)
     {
@@ -72,7 +73,9 @@
       building1->SetBuildingType (Building::Residential);
       building1->SetExtWallsType (Building::ConcreteWithWindows);
     }
-
+  
+  Ptr<MobilityBuildingInfo> buildingInfoEnb = Create<MobilityBuildingInfo> ();
+  mmEnb->AggregateObject (buildingInfoEnb); // operation usually done by BuildingsHelper::Install
   BuildingsHelper::MakeConsistent (mmEnb);
   
   Ptr<HybridBuildingsPropagationLossModel> propagationLossModel = CreateObject<HybridBuildingsPropagationLossModel> ();
@@ -86,8 +89,10 @@
   //for (uint8_t i = 0; i < 23; i++)
   for (uint32_t i = 1; i < 2300; i++)
     {
-      Ptr<BuildingsMobilityModel> mmUe = CreateObject<BuildingsMobilityModel> ();
-      mmUe->SetPosition (Vector (i, 0.0, hUe));      
+      Ptr<ConstantPositionMobilityModel> mmUe = CreateObject<ConstantPositionMobilityModel> ();
+      mmUe->SetPosition (Vector (i, 0.0, hUe));
+      Ptr<MobilityBuildingInfo> buildingInfoUe = Create<MobilityBuildingInfo> ();
+      mmEnb->AggregateObject (buildingInfoUe); // operation usually done by BuildingsHelper::Install
       BuildingsHelper::MakeConsistent (mmUe);
       double loss = propagationLossModel->GetLoss (mmEnb, mmUe);
       outFile << i << "\t"
--- a/src/buildings/helper/building-position-allocator.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/helper/building-position-allocator.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -18,7 +18,8 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 #include "building-position-allocator.h"
-#include "ns3/buildings-mobility-model.h"
+#include <ns3/mobility-building-info.h>
+#include "ns3/mobility-model.h"
 #include "ns3/buildings-helper.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/double.h"
@@ -209,9 +210,9 @@
     {
       Ptr<MobilityModel> mm = (*it)->GetObject<MobilityModel> ();
       NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
-      Ptr<BuildingsMobilityModel> bmm = DynamicCast<BuildingsMobilityModel> (mm);
-      NS_ASSERT_MSG (bmm, "mobility model aggregated to this node is not a BuildingsMobilityModel");
-      BuildingsHelper::MakeConsistent (bmm);
+      Ptr<MobilityBuildingInfo> bmm = mm->GetObject <MobilityBuildingInfo> ();
+      NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
+      BuildingsHelper::MakeConsistent (mm);
     }
 }
 
@@ -239,8 +240,8 @@
   NS_LOG_LOGIC ("considering node " << (*m_nodeIt)->GetId ());
   Ptr<MobilityModel> mm = (*m_nodeIt)->GetObject<MobilityModel> ();
   NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
-  Ptr<BuildingsMobilityModel> bmm = DynamicCast<BuildingsMobilityModel> (mm);
-  NS_ASSERT_MSG (bmm, "mobility model aggregated to this node is not a BuildingsMobilityModel");
+  Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
+  NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
 
   ++m_nodeIt;
   uint32_t roomx = bmm->GetRoomNumberX ();
--- a/src/buildings/helper/buildings-helper.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/helper/buildings-helper.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -24,7 +24,7 @@
 #include <ns3/building.h>
 #include <ns3/building-list.h>
 #include <ns3/mobility-model.h>
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
 #include <ns3/abort.h>
 #include <ns3/log.h>
 
@@ -33,6 +33,32 @@
 
 namespace ns3 {
 
+
+void
+BuildingsHelper::Install (NodeContainer c)
+{
+  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+      Install (*i);
+    }
+}
+
+
+void
+BuildingsHelper::Install (Ptr<Node> node)
+{
+  Ptr<Object> object = node;
+  Ptr<MobilityModel> model = object->GetObject<MobilityModel> ();
+  if (model == 0)
+    {
+      NS_ABORT_MSG_UNLESS (0 != model, "node " << node->GetId () << " does not have a MobilityModel");
+
+    }
+  Ptr<MobilityBuildingInfo> buildingInfo = CreateObject<MobilityBuildingInfo> ();
+  model->AggregateObject (buildingInfo);
+}
+
+
 void
 BuildingsHelper::MakeMobilityModelConsistent ()
 {
@@ -42,26 +68,27 @@
       Ptr<MobilityModel> mm = (*nit)->GetObject<MobilityModel> ();
       if (mm != 0)
         {
-          Ptr<BuildingsMobilityModel> bmm = DynamicCast<BuildingsMobilityModel> (mm);
-          NS_ABORT_MSG_UNLESS (0 != bmm, "node " << (*nit)->GetId () << " has a MobilityModel but it is not a BuildingsMobilityModel");
-          MakeConsistent (bmm);
+          MakeConsistent (mm);
+          Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
+          NS_ABORT_MSG_UNLESS (0 != bmm, "node " << (*nit)->GetId () << " has a MobilityModel that does not have a MobilityBuildingInfo");
         }
     }
 }
 
 
 void
-BuildingsHelper::MakeConsistent (Ptr<BuildingsMobilityModel> bmm)
+BuildingsHelper::MakeConsistent (Ptr<MobilityModel> mm)
 {
+  Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
   bool found = false;
   for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
     {
       NS_LOG_LOGIC ("checking building " << (*bit)->GetId () << " with boundaries " << (*bit)->GetBoundaries ());
-      Vector pos = bmm->GetPosition ();
+      Vector pos = mm->GetPosition ();
       if ((*bit)->IsInside (pos))
         {
-          NS_LOG_LOGIC ("BuildingsMobilityModel " << bmm << " pos " << bmm->GetPosition () << " falls inside building " << (*bit)->GetId ());
-          NS_ABORT_MSG_UNLESS (found == false, " BuildingsMobilityModel already inside another building!");		
+          NS_LOG_LOGIC ("MobilityBuildingInfo " << bmm << " pos " << mm->GetPosition () << " falls inside building " << (*bit)->GetId ());
+          NS_ABORT_MSG_UNLESS (found == false, " MobilityBuildingInfo already inside another building!");		
           found = true;
           uint16_t floor = (*bit)->GetFloor (pos);
           uint16_t roomX = (*bit)->GetRoomX (pos);
@@ -71,7 +98,7 @@
     }
   if (!found)
     {
-      NS_LOG_LOGIC ("BuildingsMobilityModel " << bmm << " pos " << bmm->GetPosition ()  << " is outdoor");
+      NS_LOG_LOGIC ("MobilityBuildingInfo " << bmm << " pos " << mm->GetPosition ()  << " is outdoor");
       bmm->SetOutdoor ();
     }
 
--- a/src/buildings/helper/buildings-helper.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/helper/buildings-helper.h	Tue Jun 04 17:20:40 2013 +0200
@@ -30,13 +30,36 @@
 
 namespace ns3 {
 
-class BuildingsMobilityModel;
+class MobilityModel;
+class Building;
 
 class BuildingsHelper
 {
-public:  
+public:
+  /**
+  * Install the MobilityBuildingInfo to a node
+  *
+  * \param node the mobility model of the node to be updated
+  */
+  static void Install (Ptr<Node> node);     // for any nodes
+  /**
+  * Install the MobilityBuildingInfo to the set of nodes in a NodeContainer
+  *
+  * \param c the NodeContainer including the nodes to be updated
+  */
+  static void Install (NodeContainer c);     // for any nodes
+  /**
+  * Update the node in the simulation scenario MobilityBuildingInfo according 
+  * to the buildings created
+  *
+  */
   static void MakeMobilityModelConsistent ();
-  static void MakeConsistent (Ptr<BuildingsMobilityModel> bmm);
+  /**
+  * Update the MobilityBuildingInfo according to the buildings created
+  *
+  * \param bmm the mobility model of the node to be updated
+  */
+  static void MakeConsistent (Ptr<MobilityModel> bmm);
   
 };
 
--- a/src/buildings/model/buildings-mobility-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Marco Miozzo  <marco.miozzo@cttc.es>
- * 
- */
-
-#include <ns3/simulator.h>
-#include <ns3/position-allocator.h>
-#include <ns3/buildings-mobility-model.h>
-#include <ns3/pointer.h>
-#include <ns3/log.h>
-#include <ns3/assert.h>
-
-NS_LOG_COMPONENT_DEFINE ("BuildingsMobilityModel");
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (BuildingsMobilityModel);
-
-TypeId
-BuildingsMobilityModel::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::BuildingsMobilityModel")
-    .SetParent<MobilityModel> ()
-    .SetGroupName ("Mobility")
-    .AddConstructor<BuildingsMobilityModel> ();
-
-  return tid;
-}
-
-
-BuildingsMobilityModel::BuildingsMobilityModel ()
-{
-  NS_LOG_FUNCTION (this);
-  m_indoor = false;
-  m_nFloor = 1;
-  m_roomX = 1;
-  m_roomY = 1;
-}
-
-void
-BuildingsMobilityModel::DoDispose (void)
-{
-  NS_LOG_FUNCTION (this);
-  MobilityModel::DoDispose ();
-}
-
-Vector
-BuildingsMobilityModel::DoGetPosition (void) const
-{
-  NS_LOG_FUNCTION (this);
-  m_helper.Update ();
-  return m_helper.GetCurrentPosition ();
-}
-void 
-BuildingsMobilityModel::DoSetPosition (const Vector &position)
-{
-  NS_LOG_FUNCTION (this);
-  m_helper.SetPosition (position);
-}
-Vector
-BuildingsMobilityModel::DoGetVelocity (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_helper.GetVelocity ();
-}
-
-bool
-BuildingsMobilityModel::IsIndoor (void)
-{
-  NS_LOG_FUNCTION (this);
-  return (m_indoor);
-}
-
-bool
-BuildingsMobilityModel::IsOutdoor (void)
-{
-  NS_LOG_FUNCTION (this);
-  return (!m_indoor);
-}
-
-void
-BuildingsMobilityModel::SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy)
-{
-  NS_LOG_FUNCTION (this);
-  m_indoor = true;
-  m_myBuilding = building;
-  m_nFloor = nfloor;
-  m_roomX = nroomx;
-  m_roomY = nroomy;
-  
-  NS_ASSERT_MSG (building->IsInside (m_helper.GetCurrentPosition ()), "Position of the node is outside of building bounds");
-  NS_ASSERT (m_roomX > 0);
-  NS_ASSERT (m_roomX <= building->GetNRoomsX ());
-  NS_ASSERT (m_roomY > 0);
-  NS_ASSERT (m_roomY <= building->GetNRoomsY ());
-  NS_ASSERT (m_nFloor > 0);
-  NS_ASSERT (m_nFloor <= building->GetNFloors ());
-
-}
-
-
-void
-BuildingsMobilityModel::SetOutdoor (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_indoor = false;
-}
-
-uint8_t
-BuildingsMobilityModel::GetFloorNumber (void)
-{
-  NS_LOG_FUNCTION (this);
-  return (m_nFloor);
-}
-
-uint8_t
-BuildingsMobilityModel::GetRoomNumberX (void)
-{
-  NS_LOG_FUNCTION (this);
-  return (m_roomX);
-}
-
-uint8_t
-BuildingsMobilityModel::GetRoomNumberY (void)
-{
-  NS_LOG_FUNCTION (this);
-  return (m_roomY);
-}
-
-
-Ptr<Building>
-BuildingsMobilityModel::GetBuilding ()
-{
-  NS_LOG_FUNCTION (this);
-  return (m_myBuilding);
-}
-
-  
-} // namespace
--- a/src/buildings/model/buildings-mobility-model.h	Tue Jun 04 12:41:52 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Marco Miozzo  <marco.miozzo@cttc.es>
- * 
- */
-#ifndef BUILDINGS_MOBILITY_MODEL_H
-#define BUILDINGS_MOBILITY_MODEL_H
-
-
-
-#include <ns3/mobility-model.h>
-#include <ns3/ptr.h>
-#include <ns3/object.h>
-#include <ns3/box.h>
-#include <map>
-#include <ns3/building.h>
-#include <ns3/constant-velocity-helper.h>
-
-
-
-namespace ns3 {
-
-
-/**
- * \ingroup mobility
- * \brief Buildings mobility model
- *
- * This model implements the managment of scenarios where users might be
- * either indoor (e.g., houses, offices, etc.) and outdoor.
- * 
- */
-class BuildingsMobilityModel : public MobilityModel
-{
-public:
-  static TypeId GetTypeId (void);
-  BuildingsMobilityModel ();
-
-  /** 
-   * 
-   * \return true if the MobilityModel instance is indoor, false otherwise
-   */
-  bool IsIndoor (void);
-
-  /** 
-   * 
-   * \return true if the MobilityModel instance is outdoor, false otherwise
-   */
-  bool IsOutdoor (void);
-
-  /** 
-   * Mark this MobilityModel instance as indoor 
-   * 
-   * \param building the building into which the MobilityModel instance is located
-   * \param nfloor the floor number 1...nFloors at which the  MobilityModel instance is located
-   * \param nroomx the X room number 1...nRoomsX at which the  MobilityModel instance is located
-   * \param nroomy the Y room number 1...nRoomsY at which the  MobilityModel instance is located
-   */
-  void SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy);
-
-  /** 
-   * Mark this MobilityModel instance as outdoor
-   * 
-   */
-  void SetOutdoor ();
-
-  /** 
-   * 
-   * \return 
-   */
-  uint8_t GetFloorNumber (void);
-
-  /** 
-   * 
-   * \return 
-   */
-  uint8_t GetRoomNumberX (void);
-
-  /** 
-   * 
-   * \return 
-   */
-  uint8_t GetRoomNumberY (void);
-
-  /** 
-   * 
-   * \return 
-   */
-  Ptr<Building> GetBuilding ();
-
-
-
-private:
-  virtual void DoDispose (void);
-  virtual Vector DoGetPosition (void) const;
-  virtual void DoSetPosition (const Vector &position);
-  virtual Vector DoGetVelocity (void) const;
-  ConstantVelocityHelper m_helper;
-
-  Ptr<Building> m_myBuilding;
-  bool m_indoor;
-  uint8_t m_nFloor;
-  uint8_t m_roomX;
-  uint8_t m_roomY;
-
-};
-
-
-
-} // namespace ns3
-
-
-#endif // BUILDINGS_MOBILITY_MODEL_H
--- a/src/buildings/model/buildings-propagation-loss-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/buildings-propagation-loss-model.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -27,7 +27,7 @@
 #include "ns3/pointer.h"
 #include <cmath>
 #include "buildings-propagation-loss-model.h"
-#include "ns3/buildings-mobility-model.h"
+#include <ns3/mobility-building-info.h>
 #include "ns3/enum.h"
 
 
@@ -100,7 +100,7 @@
 }
 
 double
-BuildingsPropagationLossModel::ExternalWallLoss (Ptr<BuildingsMobilityModel> a) const
+BuildingsPropagationLossModel::ExternalWallLoss (Ptr<MobilityBuildingInfo> a) const
 {
   double loss = 0.0;
   Ptr<Building> aBuilding = a->GetBuilding ();
@@ -124,7 +124,7 @@
 }
 
 double
-BuildingsPropagationLossModel::HeightLoss (Ptr<BuildingsMobilityModel> node) const
+BuildingsPropagationLossModel::HeightLoss (Ptr<MobilityBuildingInfo> node) const
 {
   double loss = 0.0;
 
@@ -134,7 +134,7 @@
 }
 
 double
-BuildingsPropagationLossModel::InternalWallsLoss (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel>b) const
+BuildingsPropagationLossModel::InternalWallsLoss (Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo>b) const
 {
   // approximate the number of internal walls with the Manhattan distance in "rooms" units
   double dx = std::abs (a->GetRoomNumberX () - b->GetRoomNumberX ());
@@ -148,9 +148,9 @@
 BuildingsPropagationLossModel::GetShadowing (Ptr<MobilityModel> a, Ptr<MobilityModel> b)
 const
 {
-    Ptr<BuildingsMobilityModel> a1 = DynamicCast<BuildingsMobilityModel> (a);
-    Ptr<BuildingsMobilityModel> b1 = DynamicCast<BuildingsMobilityModel> (b);
-    NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "BuildingsPropagationLossModel only works with BuildingsMobilityModel");
+    Ptr<MobilityBuildingInfo> a1 = a->GetObject <MobilityBuildingInfo> ();
+    Ptr<MobilityBuildingInfo> b1 = b->GetObject <MobilityBuildingInfo> ();
+    NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "BuildingsPropagationLossModel only works with MobilityBuildingInfo");
   
   std::map<Ptr<MobilityModel>,  std::map<Ptr<MobilityModel>, ShadowingLoss> >::iterator ait = m_shadowingLossMap.find (a);
   if (ait != m_shadowingLossMap.end ())
@@ -184,7 +184,7 @@
 
 
 double
-BuildingsPropagationLossModel::EvaluateSigma (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b)
+BuildingsPropagationLossModel::EvaluateSigma (Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b)
 const
 {
   if (a->IsOutdoor ())
--- a/src/buildings/model/buildings-propagation-loss-model.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/buildings-propagation-loss-model.h	Tue Jun 04 17:20:40 2013 +0200
@@ -27,7 +27,8 @@
 #include "ns3/propagation-loss-model.h"
 #include "ns3/random-variable-stream.h"
 #include <ns3/building.h>
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
+
 
 
 namespace ns3 {
@@ -48,7 +49,8 @@
  *  The distance-dependent component of propagation loss is deferred
  *  to derived classes which are expected to implement the GetLoss method.
  *  
- *  \warning This model works only with BuildingsMobilityModel
+ *  \warning This model works only when MobilityBuildingInfo is aggreegated
+ *  to the mobility model
  *
  */
 
@@ -70,9 +72,9 @@
   virtual double DoCalcRxPower (double txPowerDbm, Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
 protected:
-  double ExternalWallLoss (Ptr<BuildingsMobilityModel> a) const;
-  double HeightLoss (Ptr<BuildingsMobilityModel> n) const;
-  double InternalWallsLoss (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const;
+  double ExternalWallLoss (Ptr<MobilityBuildingInfo> a) const;
+  double HeightLoss (Ptr<MobilityBuildingInfo> n) const;
+  double InternalWallsLoss (Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b) const;
   
   double GetShadowing (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
@@ -92,7 +94,7 @@
   };
 
   mutable std::map<Ptr<MobilityModel>,  std::map<Ptr<MobilityModel>, ShadowingLoss> > m_shadowingLossMap;
-  double EvaluateSigma (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const;
+  double EvaluateSigma (Ptr<MobilityBuildingInfo> a, Ptr<MobilityBuildingInfo> b) const;
 
 
   double m_shadowingSigmaExtWalls;
--- a/src/buildings/model/hybrid-buildings-propagation-loss-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/hybrid-buildings-propagation-loss-model.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -31,7 +31,7 @@
 #include "ns3/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h"
 #include "ns3/itu-r-1238-propagation-loss-model.h"
 #include "ns3/kun-2600-mhz-propagation-loss-model.h"
-#include "ns3/buildings-mobility-model.h"
+#include <ns3/mobility-building-info.h>
 #include "ns3/enum.h"
 
 #include "hybrid-buildings-propagation-loss-model.h"
@@ -146,10 +146,10 @@
   
   double distance = a->GetDistanceFrom (b);
 
-  // get the BuildingsMobilityModel pointers
-  Ptr<BuildingsMobilityModel> a1 = DynamicCast<BuildingsMobilityModel> (a);
-  Ptr<BuildingsMobilityModel> b1 = DynamicCast<BuildingsMobilityModel> (b);
-  NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "HybridBuildingsPropagationLossModel only works with BuildingsMobilityModel");
+  // get the MobilityBuildingInfo pointers
+  Ptr<MobilityBuildingInfo> a1 = a->GetObject<MobilityBuildingInfo> ();
+  Ptr<MobilityBuildingInfo> b1 = b->GetObject<MobilityBuildingInfo> ();
+  NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "HybridBuildingsPropagationLossModel only works with MobilityBuildingInfo");
 
   double loss = 0.0;
 
@@ -159,24 +159,24 @@
         {
           if (distance > 1000)
             {
-              NS_LOG_INFO (this << a1->GetPosition ().z << b1->GetPosition ().z << m_rooftopHeight);
-              if ((a1->GetPosition ().z < m_rooftopHeight)
-                  && (b1->GetPosition ().z < m_rooftopHeight))
+              NS_LOG_INFO (this << a->GetPosition ().z << b->GetPosition ().z << m_rooftopHeight);
+              if ((a->GetPosition ().z < m_rooftopHeight)
+                  && (b->GetPosition ().z < m_rooftopHeight))
                 {
-                  loss = ItuR1411 (a1, b1);
+                  loss = ItuR1411 (a, b);
                   NS_LOG_INFO (this << " 0-0 (>1000): below rooftop -> ITUR1411 : " << loss);
                 }
               else
                 {
                   // Over the rooftop tranmission -> Okumura Hata
-                  loss = OkumuraHata (a1, b1);
+                  loss = OkumuraHata (a, b);
                   NS_LOG_INFO (this << " O-O (>1000): above rooftop -> OH : " << loss);
                 }
             }
           else
             {
               // short range outdoor communication
-              loss = ItuR1411 (a1, b1);
+              loss = ItuR1411 (a, b);
               NS_LOG_INFO (this << " 0-0 (<1000) Street canyon -> ITUR1411 : " << loss);
             }
         }
@@ -185,21 +185,21 @@
           // b indoor
           if (distance > 1000)
             {
-              if ((a1->GetPosition ().z < m_rooftopHeight)
-                  && (b1->GetPosition ().z < m_rooftopHeight))
+              if ((a->GetPosition ().z < m_rooftopHeight)
+                  && (b->GetPosition ().z < m_rooftopHeight))
                 {                  
-                  loss = ItuR1411 (a1, b1) + ExternalWallLoss (b1) + HeightLoss (a1);
+                  loss = ItuR1411 (a, b) + ExternalWallLoss (b1) + HeightLoss (b1);
                   NS_LOG_INFO (this << " 0-I (>1000): below rooftop -> ITUR1411 : " << loss);
                 }
               else
                 {
-                  loss = OkumuraHata (a1, b1) + ExternalWallLoss (b1);
+                  loss = OkumuraHata (a, b) + ExternalWallLoss (b1);
                   NS_LOG_INFO (this << " O-I (>1000): above the rooftop -> OH : " << loss);
                 }
             }
           else
             {
-              loss = ItuR1411 (a1, b1) + ExternalWallLoss (b1) + HeightLoss (b1);
+              loss = ItuR1411 (a, b) + ExternalWallLoss (b1) + HeightLoss (b1);
               NS_LOG_INFO (this << " 0-I (<1000) ITUR1411 + BEL : " << loss);
             }
         } // end b1->isIndoor ()
@@ -212,14 +212,14 @@
           if (a1->GetBuilding () == b1->GetBuilding ())
             {
               // nodes are in same building -> indoor communication ITU-R P.1238
-              loss = ItuR1238 (a1, b1) + InternalWallsLoss (a1, b1);;
+              loss = ItuR1238 (a, b) + InternalWallsLoss (a1, b1);;
               NS_LOG_INFO (this << " I-I (same building) ITUR1238 : " << loss);
 
             }
           else
             {
               // nodes are in different buildings
-              loss = ItuR1411 (a1, b1) + ExternalWallLoss (a1) + ExternalWallLoss (b1);
+              loss = ItuR1411 (a, b) + ExternalWallLoss (a1) + ExternalWallLoss (b1);
               NS_LOG_INFO (this << " I-I (different) ITUR1238 + 2*BEL : " << loss);
             }
         }
@@ -228,22 +228,22 @@
           // b is outdoor
           if (distance > 1000)
             {
-              if ((a1->GetPosition ().z < m_rooftopHeight)
-                  && (b1->GetPosition ().z < m_rooftopHeight))
+              if ((a->GetPosition ().z < m_rooftopHeight)
+                  && (b->GetPosition ().z < m_rooftopHeight))
                 {
-                  loss = ItuR1411 (a1, b1) + ExternalWallLoss (a1) + HeightLoss (a1);
+                  loss = ItuR1411 (a, b) + ExternalWallLoss (a1) + HeightLoss (a1);
                   NS_LOG_INFO (this << " I-O (>1000): down rooftop -> ITUR1411 : " << loss);
                 }
               else
                 {
                   // above rooftop -> OH
-                  loss = OkumuraHata (a1, b1) + ExternalWallLoss (a1) + HeightLoss (a1);
+                  loss = OkumuraHata (a, b) + ExternalWallLoss (a1) + HeightLoss (a1);
                   NS_LOG_INFO (this << " =I-O (>1000) over rooftop OH + BEL + HG: " << loss);
                 }
             }
           else
             {
-              loss = ItuR1411 (a1, b1) + ExternalWallLoss (a1)  + HeightLoss (a1);
+              loss = ItuR1411 (a, b) + ExternalWallLoss (a1)  + HeightLoss (a1);
               NS_LOG_INFO (this << " I-O (<1000)  ITUR1411 + BEL + HG: " << loss);
             }
         } // end b1->IsIndoor ()
@@ -256,7 +256,7 @@
 
 
 double
-HybridBuildingsPropagationLossModel::OkumuraHata (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const
+HybridBuildingsPropagationLossModel::OkumuraHata (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const
 {
   if (m_frequency <= 2.3e9)
     {
@@ -269,7 +269,7 @@
 }
 
 double
-HybridBuildingsPropagationLossModel::ItuR1411 (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const
+HybridBuildingsPropagationLossModel::ItuR1411 (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const
 {
   if (a->GetDistanceFrom (b) < m_itu1411NlosThreshold)
     {
@@ -282,7 +282,7 @@
 }
 
 double
-HybridBuildingsPropagationLossModel::ItuR1238 (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const
+HybridBuildingsPropagationLossModel::ItuR1238 (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const
 {
   return m_ituR1238->GetLoss (a,b);
 }
--- a/src/buildings/model/hybrid-buildings-propagation-loss-model.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/hybrid-buildings-propagation-loss-model.h	Tue Jun 04 17:20:40 2013 +0200
@@ -49,7 +49,7 @@
  *  - Building penetretation loss
  *  - floors, etc...
  *
- *  \warning This model works only with BuildingsMobilityModel
+ *  \warning This model works only with MobilityBuildingInfo
  *
  */
 
@@ -100,9 +100,9 @@
   
 private:
 
-  double OkumuraHata (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const;
-  double ItuR1411 (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const;
-  double ItuR1238 (Ptr<BuildingsMobilityModel> a, Ptr<BuildingsMobilityModel> b) const;
+  double OkumuraHata (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
+  double ItuR1411 (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
+  double ItuR1238 (Ptr<MobilityModel> a, Ptr<MobilityModel> b) const;
 
   Ptr<OkumuraHataPropagationLossModel> m_okumuraHata;
   Ptr<ItuR1411LosPropagationLossModel> m_ituR1411Los;
--- a/src/buildings/model/itu-r-1238-propagation-loss-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/itu-r-1238-propagation-loss-model.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -26,7 +26,7 @@
 #include <cmath>
 
 #include "itu-r-1238-propagation-loss-model.h"
-#include "buildings-mobility-model.h"
+#include <ns3/mobility-building-info.h>
 
 NS_LOG_COMPONENT_DEFINE ("ItuR1238PropagationLossModel");
 
@@ -55,9 +55,9 @@
 ItuR1238PropagationLossModel::GetLoss (Ptr<MobilityModel> a1, Ptr<MobilityModel> b1) const
 {
   NS_LOG_FUNCTION (this << a1 << b1);
-  Ptr<BuildingsMobilityModel> a = DynamicCast<BuildingsMobilityModel> (a1);
-  Ptr<BuildingsMobilityModel> b = DynamicCast<BuildingsMobilityModel> (b1);
-  NS_ASSERT_MSG ((a != 0) && (b != 0), "ItuR1238PropagationLossModel only works with BuildingsMobilityModel");
+  Ptr<MobilityBuildingInfo> a = a1->GetObject<MobilityBuildingInfo> ();
+  Ptr<MobilityBuildingInfo> b = b1->GetObject<MobilityBuildingInfo> ();
+  NS_ASSERT_MSG ((a != 0) && (b != 0), "ItuR1238PropagationLossModel only works with MobilityBuildingInfo");
   NS_ASSERT_MSG (a->GetBuilding ()->GetId () == b->GetBuilding ()->GetId (), "ITU-R 1238 applies only to nodes that are in the same building");
   double N = 0.0;
   int n = std::abs (a->GetFloorNumber () - b->GetFloorNumber ());
@@ -95,8 +95,8 @@
     {
       NS_LOG_ERROR (this << " Unkwnon Wall Type");
     }
-  double loss = 20 * std::log10 (m_frequency / 1e6 /*MHz*/) + N * std::log10 (a->GetDistanceFrom (b)) + Lf - 28.0;
-  NS_LOG_INFO (this << " Node " << a->GetPosition () << " <-> " << b->GetPosition () << " loss = " << loss << " dB");
+  double loss = 20 * std::log10 (m_frequency / 1e6 /*MHz*/) + N * std::log10 (a1->GetDistanceFrom (b1)) + Lf - 28.0;
+  NS_LOG_INFO (this << " Node " << a1->GetPosition () << " <-> " << b1->GetPosition () << " loss = " << loss << " dB");
 
   return loss;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/buildings/model/mobility-building-info.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -0,0 +1,159 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Marco Miozzo  <marco.miozzo@cttc.es>
+ * 
+ */
+
+#include <ns3/simulator.h>
+#include <ns3/position-allocator.h>
+#include <ns3/mobility-building-info.h>
+#include <ns3/pointer.h>
+#include <ns3/log.h>
+#include <ns3/assert.h>
+
+NS_LOG_COMPONENT_DEFINE ("MobilityBuildingInfo");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (MobilityBuildingInfo);
+
+TypeId
+MobilityBuildingInfo::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MobilityBuildingInfo")
+    .SetParent<Object> ()
+    .SetGroupName ("Building")
+    .AddConstructor<MobilityBuildingInfo> ();
+
+  return tid;
+}
+
+
+MobilityBuildingInfo::MobilityBuildingInfo ()
+{
+  NS_LOG_FUNCTION (this);
+  m_indoor = false;
+  m_nFloor = 1;
+  m_roomX = 1;
+  m_roomY = 1;
+}
+
+
+MobilityBuildingInfo::MobilityBuildingInfo (Ptr<Building> building)
+  : m_myBuilding (building)
+{
+  NS_LOG_FUNCTION (this);
+  m_indoor = false;
+  m_nFloor = 1;
+  m_roomX = 1;
+  m_roomY = 1;
+}
+
+bool
+MobilityBuildingInfo::IsIndoor (void)
+{
+  NS_LOG_FUNCTION (this);
+  return (m_indoor);
+}
+
+bool
+MobilityBuildingInfo::IsOutdoor (void)
+{
+  NS_LOG_FUNCTION (this);
+  return (!m_indoor);
+}
+
+void
+MobilityBuildingInfo::SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy)
+{
+  NS_LOG_FUNCTION (this);
+  m_indoor = true;
+  m_myBuilding = building;
+  m_nFloor = nfloor;
+  m_roomX = nroomx;
+  m_roomY = nroomy;
+  
+
+  NS_ASSERT (m_roomX > 0);
+  NS_ASSERT (m_roomX <= building->GetNRoomsX ());
+  NS_ASSERT (m_roomY > 0);
+  NS_ASSERT (m_roomY <= building->GetNRoomsY ());
+  NS_ASSERT (m_nFloor > 0);
+  NS_ASSERT (m_nFloor <= building->GetNFloors ());
+
+}
+
+
+void
+MobilityBuildingInfo::SetIndoor (uint8_t nfloor, uint8_t nroomx, uint8_t nroomy)
+{
+  NS_LOG_FUNCTION (this);
+  m_indoor = true;
+  m_nFloor = nfloor;
+  m_roomX = nroomx;
+  m_roomY = nroomy;
+
+  NS_ASSERT_MSG (m_myBuilding, "Node does not have any building defined");
+  NS_ASSERT (m_roomX > 0);
+  NS_ASSERT (m_roomX <= m_myBuilding->GetNRoomsX ());
+  NS_ASSERT (m_roomY > 0);
+  NS_ASSERT (m_roomY <= m_myBuilding->GetNRoomsY ());
+  NS_ASSERT (m_nFloor > 0);
+  NS_ASSERT (m_nFloor <= m_myBuilding->GetNFloors ());
+
+}
+
+
+void
+MobilityBuildingInfo::SetOutdoor (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_indoor = false;
+}
+
+uint8_t
+MobilityBuildingInfo::GetFloorNumber (void)
+{
+  NS_LOG_FUNCTION (this);
+  return (m_nFloor);
+}
+
+uint8_t
+MobilityBuildingInfo::GetRoomNumberX (void)
+{
+  NS_LOG_FUNCTION (this);
+  return (m_roomX);
+}
+
+uint8_t
+MobilityBuildingInfo::GetRoomNumberY (void)
+{
+  NS_LOG_FUNCTION (this);
+  return (m_roomY);
+}
+
+
+Ptr<Building>
+MobilityBuildingInfo::GetBuilding ()
+{
+  NS_LOG_FUNCTION (this);
+  return (m_myBuilding);
+}
+
+  
+} // namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/buildings/model/mobility-building-info.h	Tue Jun 04 17:20:40 2013 +0200
@@ -0,0 +1,127 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Marco Miozzo  <marco.miozzo@cttc.es>
+ * 
+ */
+#ifndef MOBILITY_BUILDING_INFO_H
+#define MOBILITY_BUILDING_INFO_H
+
+
+
+#include <ns3/simple-ref-count.h>
+#include <ns3/ptr.h>
+#include <ns3/object.h>
+#include <ns3/box.h>
+#include <map>
+#include <ns3/building.h>
+#include <ns3/constant-velocity-helper.h>
+
+
+
+namespace ns3 {
+
+
+/**
+ * \ingroup buildings
+ * \brief mobility buildings information (to be used by mobility models)
+ *
+ * This model implements the managment of scenarios where users might be
+ * either indoor (e.g., houses, offices, etc.) and outdoor.
+ * 
+ */
+class MobilityBuildingInfo : public Object
+{
+public:
+  static TypeId GetTypeId (void);
+  MobilityBuildingInfo ();
+
+  MobilityBuildingInfo (Ptr<Building> building);
+
+  /** 
+   * 
+   * \return true if the MobilityBuildingInfo instance is indoor, false otherwise
+   */
+  bool IsIndoor (void);
+
+  /** 
+   * 
+   * \return true if the MobilityBuildingInfo instance is outdoor, false otherwise
+   */
+  bool IsOutdoor (void);
+
+  /** 
+   * Mark this MobilityBuildingInfo instance as indoor
+   * 
+   * \param building the building into which the MobilityBuildingInfo instance is located
+   * \param nfloor the floor number 1...nFloors at which the  MobilityBuildingInfo instance is located
+   * \param nroomx the X room number 1...nRoomsX at which the  MobilityBuildingInfo instance is located
+   * \param nroomy the Y room number 1...nRoomsY at which the  MobilityBuildingInfo instance is located
+   */
+  void SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy);
+
+
+  void SetIndoor (uint8_t nfloor, uint8_t nroomx, uint8_t nroomy);
+
+  /** 
+   * Mark this MobilityBuildingInfo instance as outdoor
+   * 
+   */
+  void SetOutdoor ();
+
+  /** 
+   * 
+   * \return 
+   */
+  uint8_t GetFloorNumber (void);
+
+  /** 
+   * 
+   * \return 
+   */
+  uint8_t GetRoomNumberX (void);
+
+  /** 
+   * 
+   * \return 
+   */
+  uint8_t GetRoomNumberY (void);
+
+  /** 
+   * 
+   * \return 
+   */
+  Ptr<Building> GetBuilding ();
+
+
+
+private:
+
+  Ptr<Building> m_myBuilding;
+  bool m_indoor;
+  uint8_t m_nFloor;
+  uint8_t m_roomX;
+  uint8_t m_roomY;
+
+};
+
+
+
+} // namespace ns3
+
+
+#endif // MOBILITY_BUILDING_INFO_H
--- a/src/buildings/model/oh-buildings-propagation-loss-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/oh-buildings-propagation-loss-model.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -26,7 +26,7 @@
 #include "ns3/pointer.h"
 #include <cmath>
 #include "oh-buildings-propagation-loss-model.h"
-#include "ns3/buildings-mobility-model.h"
+#include <ns3/mobility-building-info.h>
 #include "ns3/okumura-hata-propagation-loss-model.h"
 #include "ns3/enum.h"
 
@@ -66,9 +66,9 @@
 {
   NS_LOG_FUNCTION (this << a << b);
 
-  // get the BuildingsMobilityModel pointers
-  Ptr<BuildingsMobilityModel> a1 = DynamicCast<BuildingsMobilityModel> (a);
-  Ptr<BuildingsMobilityModel> b1 = DynamicCast<BuildingsMobilityModel> (b);
+  // get the MobilityBuildingInfo pointers
+  Ptr<MobilityBuildingInfo> a1 = DynamicCast<MobilityBuildingInfo> (a);
+  Ptr<MobilityBuildingInfo> b1 = DynamicCast<MobilityBuildingInfo> (b);
   NS_ASSERT_MSG ((a1 != 0) && (b1 != 0), "OhBuildingsPropagationLossModel only works with BuildingsMobilityModel");
 
   double loss = 0.0;
@@ -77,13 +77,13 @@
     {
       if (b1->IsOutdoor ())
         {
-          loss = m_okumuraHata->GetLoss (a1, b1);
+          loss = m_okumuraHata->GetLoss (a, b);
           NS_LOG_INFO (this << " O-O : " << loss);
         }
       else
         {
           // b indoor
-          loss = m_okumuraHata->GetLoss (a1, b1) + ExternalWallLoss (b1);
+          loss = m_okumuraHata->GetLoss (a, b) + ExternalWallLoss (b1);
           NS_LOG_INFO (this << " O-I : " << loss);
         } // end b1->isIndoor ()
     }
@@ -95,20 +95,20 @@
           if (a1->GetBuilding () == b1->GetBuilding ())
             {
               // nodes are in same building -> indoor communication ITU-R P.1238
-              loss = m_okumuraHata->GetLoss (a1, b1) + InternalWallsLoss (a1, b1);;
+              loss = m_okumuraHata->GetLoss (a, b) + InternalWallsLoss (a1, b1);;
               NS_LOG_INFO (this << " I-I (same building)" << loss);
 
             }
           else
             {
               // nodes are in different buildings
-              loss = m_okumuraHata->GetLoss (a1, b1) + ExternalWallLoss (a1) + ExternalWallLoss (b1);
+              loss = m_okumuraHata->GetLoss (a, b) + ExternalWallLoss (a1) + ExternalWallLoss (b1);
               NS_LOG_INFO (this << " I-O-I (different buildings): " << loss);
             }
         }
       else
         {
-          loss = m_okumuraHata->GetLoss (a1, b1) + ExternalWallLoss (a1);
+          loss = m_okumuraHata->GetLoss (a, b) + ExternalWallLoss (a1);
           NS_LOG_INFO (this << " I-O : " << loss);
         } // end b1->IsIndoor ()
     } // end a1->IsOutdoor ()
--- a/src/buildings/model/oh-buildings-propagation-loss-model.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/model/oh-buildings-propagation-loss-model.h	Tue Jun 04 17:20:40 2013 +0200
@@ -33,7 +33,7 @@
  *
  *  this model combines the OkumuraHata model with the BuildingsPropagationLossModel
  * 
- *  \warning This model works with BuildingsMobilityModel only
+ *  \warning This model works with MobilityBuildingInfo only
  *
  */
 class OhBuildingsPropagationLossModel : public BuildingsPropagationLossModel
--- a/src/buildings/test/building-position-allocator-test.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/test/building-position-allocator-test.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -23,7 +23,9 @@
 #include "ns3/log.h"
 #include "ns3/test.h"
 #include <ns3/building-position-allocator.h>
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
+#include <ns3/constant-position-mobility-model.h>
+#include <ns3/mobility-model.h>
 #include <ns3/building.h>
 #include <ns3/buildings-helper.h>
 #include <ns3/mobility-helper.h>
@@ -95,10 +97,11 @@
   nodes.Create (24);
 
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (nodes);
+  BuildingsHelper::Install (nodes);
 
   BuildingsHelper::MakeMobilityModelConsistent ();
 
@@ -108,14 +111,14 @@
     {
       Ptr<MobilityModel> mm = (*it)->GetObject<MobilityModel> ();
       NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
-      Ptr<BuildingsMobilityModel> bmm = DynamicCast<BuildingsMobilityModel> (mm);
-      NS_ASSERT_MSG (bmm, "mobility model aggregated to this node is not a BuildingsMobilityModel");
+      Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
+      NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
 
       NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), true, "node should be indoor");
       Room r (bmm->GetRoomNumberX (), bmm->GetRoomNumberY (), bmm->GetFloorNumber ());
       ++(roomCounter[r]);
 
-      Vector p = bmm->GetPosition ();
+      Vector p = mm->GetPosition ();
       NS_TEST_ASSERT_MSG_GT (p.x, bmm->GetRoomNumberX (), "wrong x value");
       NS_TEST_ASSERT_MSG_LT (p.x, bmm->GetRoomNumberX () + 1, "wrong x value");
       NS_TEST_ASSERT_MSG_GT (p.y, bmm->GetRoomNumberY (), "wrong y value");
@@ -176,16 +179,18 @@
   nodes.Create (24);
 
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (nodes);
+  BuildingsHelper::Install (nodes);
 
   NodeContainer copyNodes;
   copyNodes.Create (48);
   positionAlloc = CreateObject<SameRoomPositionAllocator> (nodes);
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (copyNodes);
+  BuildingsHelper::Install (copyNodes);
 
   BuildingsHelper::MakeMobilityModelConsistent ();
 
@@ -195,8 +200,8 @@
     {
       Ptr<MobilityModel> mm = (*it)->GetObject<MobilityModel> ();
       NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
-      Ptr<BuildingsMobilityModel> bmm = DynamicCast<BuildingsMobilityModel> (mm);
-      NS_ASSERT_MSG (bmm, "mobility model aggregated to this node is not a BuildingsMobilityModel");
+      Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
+      NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
 
       NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), true, "node should be indoor");
       Room r (bmm->GetRoomNumberX (), bmm->GetRoomNumberY (), bmm->GetFloorNumber ());
--- a/src/buildings/test/buildings-helper-test.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/test/buildings-helper-test.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -22,7 +22,8 @@
 
 #include "ns3/log.h"
 #include "ns3/test.h"
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
+#include <ns3/constant-position-mobility-model.h>
 #include <ns3/building.h>
 #include <ns3/buildings-helper.h>
 #include <ns3/mobility-helper.h>
@@ -133,13 +134,13 @@
 {
   NS_LOG_FUNCTION (this << BuildNameString (m_pib, m_bd));
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
 
   NodeContainer nodes;
   nodes.Create (1);
   mobility.Install (nodes);
   
-  Ptr<BuildingsMobilityModel> bmm = nodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<ConstantPositionMobilityModel> bmm = nodes.Get (0)->GetObject<ConstantPositionMobilityModel> ();
   bmm->SetPosition (m_pib.pos);
 
   NS_LOG_LOGIC ("create building");
@@ -148,19 +149,20 @@
   b->SetNFloors (m_bd.nf);
   b->SetNRoomsX (m_bd.nrx);
   b->SetNRoomsY (m_bd.nry);
-  
+  Ptr<MobilityBuildingInfo> buildingInfo = CreateObject<MobilityBuildingInfo> (b);
+  bmm->AggregateObject (buildingInfo); // operation usually done by BuildingsHelper::Install
   BuildingsHelper::MakeMobilityModelConsistent ();
 
   
-  NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), m_pib.indoor, "indoor/outdoor mismatch");
+  NS_TEST_ASSERT_MSG_EQ (buildingInfo->IsIndoor (), m_pib.indoor, "indoor/outdoor mismatch");
   if (m_pib.indoor)
     {
-      NS_LOG_LOGIC (" got bid=" << bmm->GetBuilding ()->GetId () << ", f=" << (uint32_t) bmm->GetFloorNumber () << ", rx=" << (uint32_t) bmm->GetRoomNumberX () << ", roomY=" << (uint32_t) bmm->GetRoomNumberY ());
+      NS_LOG_LOGIC (" got bid=" << buildingInfo->GetBuilding ()->GetId () << ", f=" << (uint32_t) buildingInfo->GetFloorNumber () << ", rx=" << (uint32_t) buildingInfo->GetRoomNumberX () << ", roomY=" << (uint32_t) buildingInfo->GetRoomNumberY ());
       // only one building in this test, so Id will be 0
-      NS_TEST_ASSERT_MSG_EQ (bmm->GetBuilding ()->GetId (), 0, "Building ID mismatch");
-      NS_TEST_ASSERT_MSG_EQ ((uint32_t) bmm->GetFloorNumber (), m_pib.fn, "floor number mismatch");
-      NS_TEST_ASSERT_MSG_EQ ((uint32_t) bmm->GetRoomNumberX (), m_pib.rx, "x room number mismatch");
-      NS_TEST_ASSERT_MSG_EQ ((uint32_t) bmm->GetRoomNumberY (), m_pib.ry, "y room number mismatch");
+      NS_TEST_ASSERT_MSG_EQ (buildingInfo->GetBuilding ()->GetId (), 0, "Building ID mismatch");
+      NS_TEST_ASSERT_MSG_EQ ((uint32_t) buildingInfo->GetFloorNumber (), m_pib.fn, "floor number mismatch");
+      NS_TEST_ASSERT_MSG_EQ ((uint32_t) buildingInfo->GetRoomNumberX (), m_pib.rx, "x room number mismatch");
+      NS_TEST_ASSERT_MSG_EQ ((uint32_t) buildingInfo->GetRoomNumberY (), m_pib.ry, "y room number mismatch");
     }
 
   Simulator::Destroy ();  
--- a/src/buildings/test/buildings-pathloss-test.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/test/buildings-pathloss-test.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -28,8 +28,10 @@
 #include <ns3/double.h>
 #include <ns3/building.h>
 #include <ns3/enum.h>
+#include <ns3/constant-position-mobility-model.h>
+#include <ns3/mobility-building-info.h>
+#include "buildings-pathloss-test.h"
 
-#include "buildings-pathloss-test.h"
 
 
 NS_LOG_COMPONENT_DEFINE ("BuildingsPathlossTest");
@@ -201,62 +203,62 @@
   double hb = 30;
   double henbHeight = 10.0;
 
-  Ptr<BuildingsMobilityModel> mm;
+  Ptr<MobilityModel> mm;
   
   switch (index)
     {
     case 1:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (0.0, 0.0, hb));
       break;
 
     case 2:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (2000, 0.0, hm));
       break;
 
     case 3:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (100, 0.0, hm));
       break;
 
     case 4:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (900, 0.0, hm));
       break;
 
     case 5:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-5, 0.0, hm));
       break;
 
     case 6:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-5, 30, henbHeight));
       break;
 
     case 7:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-2000, 0.0, hm));
       break;
 
     case 8:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-100, 0.0, hm));
       break;
 
     case 9:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (0, 0.0, hm));
       break;
 
     case 10:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-100, 0.0, henbHeight));
       break;
 
     case 11:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-500, 0.0, henbHeight));
       break;
 
@@ -264,6 +266,8 @@
       mm = 0;
       break;
     }
+  Ptr<MobilityBuildingInfo> buildingInfo = CreateObject<MobilityBuildingInfo> ();
+  mm->AggregateObject (buildingInfo); // operation usually done by BuildingsHelper::Install
   BuildingsHelper::MakeConsistent (mm); 
   return mm;
 }
--- a/src/buildings/test/buildings-pathloss-test.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/test/buildings-pathloss-test.h	Tue Jun 04 17:20:40 2013 +0200
@@ -22,7 +22,6 @@
 #define BUILDINGS_PATHLOSS_TEST_H
 
 #include <ns3/test.h>
-#include <ns3/buildings-mobility-model.h>
 #include <ns3/hybrid-buildings-propagation-loss-model.h>
 
 
--- a/src/buildings/test/buildings-shadowing-test.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/test/buildings-shadowing-test.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -27,6 +27,9 @@
 #include <ns3/building.h>
 #include <ns3/enum.h>
 #include <ns3/buildings-helper.h>
+#include <ns3/mobility-model.h>
+#include <ns3/mobility-building-info.h>
+#include <ns3/constant-position-mobility-model.h>
 
 #include "buildings-shadowing-test.h"
 
@@ -142,62 +145,62 @@
   double hb = 30;
   double henbHeight = 10.0;
 
-  Ptr<BuildingsMobilityModel> mm;
+  Ptr<MobilityModel> mm;
   
   switch (index)
     {
     case 1:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (0.0, 0.0, hb));
       break;
 
     case 2:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (2000, 0.0, hm));
       break;
 
     case 3:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (100, 0.0, hm));
       break;
 
     case 4:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (900, 0.0, hm));
       break;
 
     case 5:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-5, 0.0, hm));
       break;
 
     case 6:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-5, 30, henbHeight));
       break;
 
     case 7:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-2000, 0.0, hm));
       break;
 
     case 8:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-100, 0.0, hm));
       break;
 
     case 9:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (0, 0.0, hm));
       break;
 
     case 10:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-100, 0.0, henbHeight));
       break;
 
     case 11:
-      mm = CreateObject<BuildingsMobilityModel> ();
+      mm = CreateObject<ConstantPositionMobilityModel> ();
       mm->SetPosition (Vector (-500, 0.0, henbHeight));
       break;
 
@@ -205,6 +208,8 @@
       mm = 0;
       break;
     }
+  Ptr<MobilityBuildingInfo> buildingInfo = CreateObject<MobilityBuildingInfo> ();
+  mm->AggregateObject (buildingInfo); // operation usually done by BuildingsHelper::Install
   BuildingsHelper::MakeConsistent (mm); 
   return mm;
 }
--- a/src/buildings/test/buildings-shadowing-test.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/test/buildings-shadowing-test.h	Tue Jun 04 17:20:40 2013 +0200
@@ -23,8 +23,6 @@
 
 #include "ns3/test.h"
 
-#include <ns3/buildings-mobility-model.h>
-#include <ns3/buildings-propagation-loss-model.h>
 
 
 namespace ns3 {
--- a/src/buildings/wscript	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/buildings/wscript	Tue Jun 04 17:20:40 2013 +0200
@@ -6,7 +6,7 @@
     module.source = [
         'model/building.cc',
         'model/building-list.cc',
-        'model/buildings-mobility-model.cc',
+        'model/mobility-building-info.cc',
         'model/itu-r-1238-propagation-loss-model.cc',
         'model/buildings-propagation-loss-model.cc',
         'model/hybrid-buildings-propagation-loss-model.cc',
@@ -30,7 +30,7 @@
     headers.source = [
         'model/building.h',
         'model/building-list.h',
-        'model/buildings-mobility-model.h',
+        'model/mobility-building-info.h',
         'model/itu-r-1238-propagation-loss-model.h',
         'model/buildings-propagation-loss-model.h',
         'model/hybrid-buildings-propagation-loss-model.h',
--- a/src/lte/doc/source/lte-user.rst	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/doc/source/lte-user.rst	Tue Jun 04 17:20:40 2013 +0200
@@ -503,17 +503,17 @@
    Excerpt of the fading trace included in the simulator for an urban  scenario (speed of 3 kmph).
 
 
-Buildings Mobility Model
-------------------------
+Mobility Model with Buildings 
+-----------------------------
 
-We now explain by examples how to use the buildings model (in particular, the ``BuildingMobilityModel`` and the ``BuildingPropagationModel`` classes) in an ns-3 simulation program to setup an LTE simulation scenario that includes buildings and indoor nodes.
+We now explain by examples how to use the buildings model (in particular, the ``MobilityBuildingInfo`` and the ``BuildingPropagationModel`` classes) in an ns-3 simulation program to setup an LTE simulation scenario that includes buildings and indoor nodes.
 
 
 .. highlight:: none
 
 #. Header files to be included::
 
-    #include <ns3/buildings-mobility-model.h>
+    #include <ns3/mobility-building-info.h>
     #include <ns3/buildings-propagation-loss-model.h>
     #include <ns3/building.h>
 
@@ -535,7 +535,9 @@
 #. Mobility model selection::
 
     MobilityHelper mobility;
-    mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+    mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); // use any mobility model
+
+It is to be noted that any mobility model can be used; however, based on the information at the time of this writing, only the ones defined in the building module are designed for considering the constraints introduced by the buildings.
 
 #. Building creation::
 
@@ -559,16 +561,17 @@
 
     ueNodes.Create (2);
     mobility.Install (ueNodes);
+    BuildingsHelper::Install (ueNodes);
     NetDeviceContainer ueDevs;
     ueDevs = lteHelper->InstallUeDevice (ueNodes);
-    Ptr<BuildingsMobilityModel> mm0 = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
-    Ptr<BuildingsMobilityModel> mm1 = enbNodes.Get (1)->GetObject<BuildingsMobilityModel> ();   
+    Ptr<BuildingsMobilityModel> mm0 = enbNodes.Get (0)->GetObject<ConstantPositionMobilityModel> ();
+    Ptr<BuildingsMobilityModel> mm1 = enbNodes.Get (1)->GetObject<ConstantPositionMobilityModel> ();   
     mm0->SetPosition (Vector (5.0, 5.0, 1.5));
     mm1->SetPosition (Vector (30.0, 40.0, 1.5));
 
-This positions the node on the scenario. Note that, in this example, node 0 will be in the building, and node 1 will be out of the building. Note that this alone is not sufficient to setup the topology correctly. What is left to be done is to issue the following command after we have placed all nodes in the simulation::
+This installs the building mobility informations to the nodes and positions the node on the scenario. Note that, in this example, node 0 will be in the building, and node 1 will be out of the building. Note that this alone is not sufficient to setup the topology correctly. What is left to be done is to issue the following command after we have placed all nodes in the simulation::
 
-      BuildingsHelper::MakeMobilityModelConsistent ();
+    BuildingsHelper::MakeMobilityModelConsistent ();
 
 This command will go through the lists of all nodes and of all buildings, determine for each user if it is indoor or outdoor, and if indoor it will also determine the building in which the user is located and the corresponding floor and number inside the building.
 
--- a/src/lte/examples/lena-cqi-threshold.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-cqi-threshold.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -24,6 +24,7 @@
 #include "ns3/mobility-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/config-store.h"
+#include <ns3/buildings-helper.h>
 //#include "ns3/gtk-config-store.h"
 
 using namespace ns3;
@@ -90,10 +91,12 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
 
   // Create Devices and install them in the Nodes (eNB and UE)
   NetDeviceContainer enbDevs;
--- a/src/lte/examples/lena-dual-stripe.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-dual-stripe.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -464,7 +464,7 @@
   macroUes.Create (nMacroUes);
 
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
 
 
   Ptr <LteHelper> lteHelper = CreateObject<LteHelper> ();
@@ -496,6 +496,7 @@
   // Macro eNBs in 3-sector hex grid
   
   mobility.Install (macroEnbs);
+  BuildingsHelper::Install (macroEnbs);
   Ptr<LteHexGridEnbTopologyHelper> lteHexGridEnbTopologyHelper = CreateObject<LteHexGridEnbTopologyHelper> ();
   lteHexGridEnbTopologyHelper->SetLteHelper (lteHelper);
   lteHexGridEnbTopologyHelper->SetAttribute ("InterSiteDistance", DoubleValue (interSiteDistance));
@@ -517,6 +518,7 @@
   Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (homeEnbs);
+  BuildingsHelper::Install (homeEnbs);
   Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (homeEnbTxPowerDbm));
   lteHelper->SetEnbAntennaModelType ("ns3::IsotropicAntennaModel");
   lteHelper->SetEnbDeviceAttribute ("DlEarfcn", UintegerValue (homeEnbDlEarfcn));
@@ -543,6 +545,8 @@
   positionAlloc->SetAttribute ("Z", PointerValue (zVal));
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (macroUes);
+  BuildingsHelper::Install (macroUes);
+  
   NetDeviceContainer macroUeDevs = lteHelper->InstallUeDevice (macroUes);
 
 
@@ -550,6 +554,7 @@
   positionAlloc = CreateObject<SameRoomPositionAllocator> (homeEnbs);
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (homeUes);
+  BuildingsHelper::Install (homeUes);
   NetDeviceContainer homeUeDevs = lteHelper->InstallUeDevice (homeUes);
 
   Ipv4Address remoteHostAddr;
--- a/src/lte/examples/lena-fading.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-fading.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -26,6 +26,7 @@
 #include "ns3/config-store.h"
 #include <ns3/string.h>
 #include <fstream>
+#include <ns3/buildings-helper.h>
 //#include "ns3/gtk-config-store.h"
 
 using namespace ns3;
@@ -86,10 +87,12 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
 
   // Create Devices and install them in the Nodes (eNB and UE)
   NetDeviceContainer enbDevs;
--- a/src/lte/examples/lena-profiling.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-profiling.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -91,7 +91,7 @@
     }
 
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   std::vector<Vector> enbPosition;
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
   Ptr<Building> building;
@@ -112,6 +112,7 @@
         }
       mobility.SetPositionAllocator (positionAlloc);
       mobility.Install (enbNodes);
+      BuildingsHelper::Install (enbNodes);
 
       // Position of UEs attached to eNB
       for (uint32_t i = 0; i < nEnb; i++)
@@ -129,6 +130,7 @@
               mobility.SetPositionAllocator (positionAlloc);
             }
           mobility.Install (ueNodes.at(i));
+          BuildingsHelper::Install (ueNodes.at(i));
         }
 
     }
@@ -144,6 +146,7 @@
       building->SetNRoomsX (nRooms);
       building->SetNRoomsY (nRooms);
       mobility.Install (enbNodes);
+      BuildingsHelper::Install (enbNodes);
       uint32_t plantedEnb = 0;
       for (uint32_t floor = 0; floor < nFloors; floor++)
         {
@@ -157,14 +160,15 @@
                             nodeHeight + roomHeight * floor);
                   positionAlloc->Add (v);
                   enbPosition.push_back (v);
-                  Ptr<BuildingsMobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<BuildingsMobilityModel> ();
+                  Ptr<MobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<MobilityModel> ();
                   mmEnb->SetPosition (v);
 
                   // Positioning UEs attached to eNB
                   mobility.Install (ueNodes.at(plantedEnb));
+                  BuildingsHelper::Install (ueNodes.at(plantedEnb));
                   for (uint32_t ue = 0; ue < nUe; ue++)
                     {
-                      Ptr<BuildingsMobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<BuildingsMobilityModel> ();
+                      Ptr<MobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<MobilityModel> ();
                       Vector vUe (v.x, v.y, v.z);
                       mmUe->SetPosition (vUe);
                     }
--- a/src/lte/examples/lena-rem-sector-antenna.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-rem-sector-antenna.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -91,8 +91,9 @@
   building->SetNFloors (1);
   building->SetNRoomsX (nRooms);
   building->SetNRoomsY (nRooms);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
+  BuildingsHelper::Install (enbNodes);
   uint32_t plantedEnb = 0;
   for (uint32_t row = 0; row < nRooms; row++)
     {
@@ -103,7 +104,7 @@
                     nodeHeight );
           positionAlloc->Add (v);
           enbPosition.push_back (v);
-          Ptr<BuildingsMobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<BuildingsMobilityModel> ();
+          Ptr<MobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<MobilityModel> ();
           mmEnb->SetPosition (v);
         }
     }
@@ -159,6 +160,7 @@
           mobility.SetPositionAllocator (positionAlloc);
         }
       mobility.Install (ueNodes.at(i));
+      BuildingsHelper::Install (ueNodes.at(i));
     }
 
   // Create Devices and install them in the Nodes (eNB and UE)
@@ -202,7 +204,6 @@
       lteHelper->ActivateDataRadioBearer (ueDev, bearer);
     }
 
-
   BuildingsHelper::MakeMobilityModelConsistent ();
 
   // by default, simulation will anyway stop right after the REM has been generated
--- a/src/lte/examples/lena-rem.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-rem.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -61,10 +61,12 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
 
   // Create Devices and install them in the Nodes (eNB and UE)
   NetDeviceContainer enbDevs;
--- a/src/lte/examples/lena-simple.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/examples/lena-simple.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -24,6 +24,7 @@
 #include "ns3/mobility-module.h"
 #include "ns3/lte-module.h"
 #include "ns3/config-store.h"
+#include <ns3/buildings-helper.h>
 //#include "ns3/gtk-config-store.h"
 
 using namespace ns3;
@@ -58,10 +59,12 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
 
   // Create Devices and install them in the Nodes (eNB and UE)
   NetDeviceContainer enbDevs;
--- a/src/lte/helper/radio-environment-map-helper.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/helper/radio-environment-map-helper.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -30,7 +30,8 @@
 #include <ns3/spectrum-channel.h>
 #include <ns3/config.h>
 #include <ns3/rem-spectrum-phy.h>
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
+#include <ns3/constant-position-mobility-model.h>
 #include <ns3/simulator.h>
 #include <ns3/node.h>
 #include <ns3/buildings-helper.h>
@@ -210,9 +211,11 @@
     {
       RemPoint p;
       p.phy = CreateObject<RemSpectrumPhy> ();
-      p.bmm = CreateObject<BuildingsMobilityModel> ();
+      p.bmm = CreateObject<ConstantPositionMobilityModel> ();
+      Ptr<MobilityBuildingInfo> buildingInfo = CreateObject<MobilityBuildingInfo> ();
+      p.bmm->AggregateObject (buildingInfo); // operation usually done by BuildingsHelper::Install
       p.phy->SetRxSpectrumModel (LteSpectrumValueHelper::GetSpectrumModel (m_earfcn, m_bandwidth));
-      p.phy->SetMobility (p.bmm); 
+      p.phy->SetMobility (p.bmm);
       m_channel->AddRx (p.phy);
       m_rem.push_back (p);
     }
--- a/src/lte/helper/radio-environment-map-helper.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/helper/radio-environment-map-helper.h	Tue Jun 04 17:20:40 2013 +0200
@@ -33,7 +33,8 @@
 class Node;
 class NetDevice;
 class SpectrumChannel;
-class BuildingsMobilityModel;
+//class BuildingsMobilityModel;
+class MobilityModel;
 
 /** 
  * Generates a 2D map of the SINR from the strongest transmitter in the downlink of an LTE FDD system.
@@ -78,7 +79,7 @@
   struct RemPoint 
   {
     Ptr<RemSpectrumPhy> phy;
-    Ptr<BuildingsMobilityModel> bmm;
+    Ptr<MobilityModel> bmm;
   };
 
   std::list<RemPoint> m_rem;
--- a/src/lte/test/lte-test-harq.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/test/lte-test-harq.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -29,7 +29,7 @@
 #include <iostream>
 #include <cmath>
 #include <ns3/radio-bearer-stats-calculator.h>
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
 #include <ns3/hybrid-buildings-propagation-loss-model.h>
 #include <ns3/eps-bearer.h>
 #include <ns3/node-container.h>
@@ -48,6 +48,7 @@
 #include <ns3/enum.h>
 #include <ns3/unused.h>
 #include <ns3/ff-mac-scheduler.h>
+#include <ns3/buildings-helper.h>
 
 #include "lte-test-harq.h"
 
@@ -171,10 +172,13 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
 
   // remove random shadowing component
   lena->SetAttribute ("PathlossModel", StringValue ("ns3::HybridBuildingsPropagationLossModel"));
@@ -205,13 +209,13 @@
   enbPhy->SetAttribute ("TxPower", DoubleValue (43.0));
   enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
   // place the HeNB over the default rooftop level (20 mt.)
-  Ptr<BuildingsMobilityModel> mm = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mm = enbNodes.Get (0)->GetObject<MobilityModel> ();
   mm->SetPosition (Vector (0.0, 0.0, 30.0));
 
   // Set UEs' position and power
   for (int i = 0; i < m_nUser; i++)
     {
-      Ptr<BuildingsMobilityModel> mm = ueNodes.Get (i)->GetObject<BuildingsMobilityModel> ();
+      Ptr<MobilityModel> mm = ueNodes.Get (i)->GetObject<MobilityModel> ();
       mm->SetPosition (Vector (m_dist, 0.0, 1.0));
       Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
       Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
--- a/src/lte/test/lte-test-mimo.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/test/lte-test-mimo.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -32,7 +32,7 @@
 #include <ns3/ptr.h>
 #include <iostream>
 #include "ns3/radio-bearer-stats-calculator.h"
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
 #include <ns3/buildings-propagation-loss-model.h>
 #include <ns3/eps-bearer.h>
 #include <ns3/node-container.h>
@@ -51,6 +51,7 @@
 #include <ns3/pf-ff-mac-scheduler.h>
 #include <ns3/pointer.h>
 #include <ns3/enum.h>
+#include <ns3/buildings-helper.h>
 
 #include "lte-test-mimo.h"
 
@@ -147,10 +148,12 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
 
   // Create Devices and install them in the Nodes (eNB and UE)
   NetDeviceContainer enbDevs;
@@ -172,11 +175,11 @@
   Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
   enbPhy->SetAttribute ("TxPower", DoubleValue (46.0));
   enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
-  Ptr<BuildingsMobilityModel> mmenb = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mmenb = enbNodes.Get (0)->GetObject<MobilityModel> ();
   mmenb->SetPosition (Vector (0.0, 0.0, 30.0));
 
   // Set UE's position and power
-  Ptr<BuildingsMobilityModel> mmue = ueNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mmue = ueNodes.Get (0)->GetObject<MobilityModel> ();
   mmue->SetPosition (Vector (m_dist, 0.0, 1.0));
   Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (0)->GetObject<LteUeNetDevice> ();
   Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
--- a/src/lte/test/lte-test-pathloss-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/test/lte-test-pathloss-model.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -31,6 +31,7 @@
 #include <ns3/hybrid-buildings-propagation-loss-model.h>
 #include <ns3/node-container.h>
 #include <ns3/mobility-helper.h>
+#include <ns3/buildings-helper.h>
 #include <ns3/lte-helper.h>
 #include <ns3/single-model-spectrum-channel.h>
 #include "ns3/string.h"
@@ -231,8 +232,10 @@
   
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (allNodes);
+  BuildingsHelper::Install (allNodes);
+
   
   // Create Devices and install them in the Nodes (eNB and UE)
   NetDeviceContainer enbDevs;
@@ -241,9 +244,9 @@
   enbDevs = lteHelper->InstallEnbDevice (enbNodes);
   ueDevs = lteHelper->InstallUeDevice (ueNodes);
   
-  Ptr<BuildingsMobilityModel> mm_enb = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mm_enb = enbNodes.Get (0)->GetObject<MobilityModel> ();
   mm_enb->SetPosition (Vector (0.0, 0.0, 30.0));
-  Ptr<BuildingsMobilityModel> mm_ue = ueNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mm_ue = ueNodes.Get (0)->GetObject<MobilityModel> ();
   mm_ue->SetPosition (Vector (m_distance, 0.0, 1.0));
   
   Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
--- a/src/lte/test/lte-test-pathloss-model.h	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/test/lte-test-pathloss-model.h	Tue Jun 04 17:20:40 2013 +0200
@@ -25,7 +25,6 @@
 
 #include "ns3/test.h"
 
-#include <ns3/buildings-mobility-model.h>
 #include <ns3/buildings-propagation-loss-model.h>
 
 
--- a/src/lte/test/lte-test-phy-error-model.cc	Tue Jun 04 12:41:52 2013 +0200
+++ b/src/lte/test/lte-test-phy-error-model.cc	Tue Jun 04 17:20:40 2013 +0200
@@ -28,7 +28,7 @@
 #include <ns3/ptr.h>
 #include <iostream>
 #include <ns3/radio-bearer-stats-calculator.h>
-#include <ns3/buildings-mobility-model.h>
+#include <ns3/mobility-building-info.h>
 #include <ns3/hybrid-buildings-propagation-loss-model.h>
 #include <ns3/eps-bearer.h>
 #include <ns3/node-container.h>
@@ -47,6 +47,7 @@
 #include <ns3/enum.h>
 #include <ns3/unused.h>
 #include <ns3/ff-mac-scheduler.h>
+#include <ns3/buildings-helper.h>
 
 #include "lte-test-phy-error-model.h"
 
@@ -183,10 +184,12 @@
 
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
   
   // remove random shadowing component
   lena->SetAttribute ("PathlossModel", StringValue ("ns3::HybridBuildingsPropagationLossModel"));
@@ -217,13 +220,13 @@
   enbPhy->SetAttribute ("TxPower", DoubleValue (43.0));
   enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
   // place the HeNB over the default rooftop level (20 mt.)
-  Ptr<BuildingsMobilityModel> mm = enbNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mm = enbNodes.Get (0)->GetObject<MobilityModel> ();
   mm->SetPosition (Vector (0.0, 0.0, 30.0));
 
   // Set UEs' position and power
   for (int i = 0; i < m_nUser; i++)
     {
-      Ptr<BuildingsMobilityModel> mm = ueNodes.Get (i)->GetObject<BuildingsMobilityModel> ();
+      Ptr<MobilityModel> mm = ueNodes.Get (i)->GetObject<MobilityModel> ();
       mm->SetPosition (Vector (m_dist, 0.0, 1.0));
       Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
       Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
@@ -368,10 +371,12 @@
   
   // Install Mobility Model
   MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::BuildingsMobilityModel");
+  BuildingsHelper::Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (ueNodes);
+  BuildingsHelper::Install (ueNodes);
   
   // remove random shadowing component
   lena->SetAttribute ("PathlossModel", StringValue ("ns3::HybridBuildingsPropagationLossModel"));
@@ -400,7 +405,7 @@
   for (int i = 0; i < m_nEnb; i++)
     {
       // place the HeNB over the default rooftop level (20 mt.)
-      Ptr<BuildingsMobilityModel> mm = enbNodes.Get (i)->GetObject<BuildingsMobilityModel> ();
+      Ptr<MobilityModel> mm = enbNodes.Get (i)->GetObject<MobilityModel> ();
       mm->SetPosition (Vector (0.0, 0.0, 30.0));
       Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (i)->GetObject<LteEnbNetDevice> ();
       Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
@@ -409,7 +414,7 @@
     }
   
   // Set UEs' position and power
-  Ptr<BuildingsMobilityModel> mm = ueNodes.Get (0)->GetObject<BuildingsMobilityModel> ();
+  Ptr<MobilityModel> mm = ueNodes.Get (0)->GetObject<MobilityModel> ();
   mm->SetPosition (Vector (m_dist, 0.0, 1.0));
   Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (0)->GetObject<LteUeNetDevice> ();
   Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();