Index: tol/btol/bgrammar/spfuninst.cpp
===================================================================
--- tol/btol/bgrammar/spfuninst.cpp	(revision 510f3f813717b731584e55ba60bf6edad8106aeb)
+++ tol/btol/bgrammar/spfuninst.cpp	(revision 7d06d2f7c7411a94ebb7bea8169117183893edeb)
@@ -1150,4 +1150,33 @@
 }
 
+//--------------------------------------------------------------------
+static BSyntaxObject* EvGetObjectFromAddress(
+  BGrammar* gra, const List* tre, BBool left)
+
+/*! Evaluate TOLPath expressions
+ */
+//--------------------------------------------------------------------
+{
+  static BText _name_ = "GetObjectFromAddress";
+  BSyntaxObject* result = NIL;
+  BInt nb = NumBranches(tre);
+  BUserText* uTxt=NULL;
+  if(TestNumArg(_name_, 1, nb, 1))
+  {
+    uTxt = (BUserText*)GraText()->EvaluateTree(Branch(tre,1));
+    BGrammar::PutLast(gra);
+    if(uTxt)
+    {
+      BText& address = Text(uTxt);
+      if(address.HasName())
+      {
+        result = BSyntaxObject::GetObjectFromAddress(address);
+      }
+    }
+  }
+  SAFE_DESTROY(uTxt,result);
+  result=TestResult(_name_,result,tre,NIL,BTRUE);
+  return(result);
+}
 
 //--------------------------------------------------------------------
@@ -1965,4 +1994,12 @@
   EvTOLPath);
 
+  AddLeftInstance("GetObjectFromAddress",
+  I2("(Text path)",
+     "(Text camino)"),
+  I2("Returns the TOL object specified by its internal address obtained by "
+     "mean of calling GetAddressFromObject.",
+     "Devuelve el objeto TOL especificado por su dirección interna que se "
+     "obtiene llamando a la función GetAddressFromObject."),
+  EvGetObjectFromAddress);
 
   AddLeftInstance("Dating",
Index: tol/btol/bgrammar/syn.cpp
===================================================================
--- tol/btol/bgrammar/syn.cpp	(revision 510f3f813717b731584e55ba60bf6edad8106aeb)
+++ tol/btol/bgrammar/syn.cpp	(revision 7d06d2f7c7411a94ebb7bea8169117183893edeb)
@@ -453,2 +453,76 @@
   }
 }
+
+//--------------------------------------------------------------------
+union BIntPointerMask
+//--------------------------------------------------------------------
+{
+  BIntPair                    pair_;
+  const BSyntaxObject*        obj_;
+  const BGrammar*             gra_;
+  const BFixedSizeMemoryBase* mhn_;
+};
+
+
+//--------------------------------------------------------------------
+  BSyntaxObject* BSyntaxObject::GetObjectFromAddress(const BText& address)
+//--------------------------------------------------------------------
+{
+  const BSyntaxObject* obj = NULL;
+  BIntPointerMask objMask, graMask, mhnMask;
+  int mode;
+  int size;
+  int pageNum;
+  sscanf(address.String(), "%X:%X:%X:%X:%X:%X:%X:%X:%X",
+    &objMask.pair_.r_,
+    &objMask.pair_.c_,
+    &graMask.pair_.r_,
+    &graMask.pair_.c_,
+    &mhnMask.pair_.r_,
+    &mhnMask.pair_.c_,
+    &mode,
+    &size,
+    &pageNum);
+  if( objMask.obj_ &&
+     (objMask.obj_->Grammar() == graMask.gra_) &&
+     (objMask.obj_->Mode() == mode) &&
+     (sizeof(objMask.obj_) == size) &&
+     (objMask.obj_->GetPageNum() == pageNum)&&
+     (objMask.obj_->GetMemHandler() == mhnMask.mhn_)&&
+     (objMask.obj_->IsAssigned()!=0))
+  {
+    obj = objMask.obj_;
+  }
+  return((BSyntaxObject*)obj);
+}
+
+//--------------------------------------------------------------------
+  BText BSyntaxObject::GetAddressFromObject() const
+//--------------------------------------------------------------------
+{
+  static char address[7*32];
+  BIntPointerMask objMask, graMask, mhnMask;
+  objMask.pair_.r_ = 0;
+  objMask.pair_.c_ = 0;
+  graMask.pair_.r_ = 0;
+  graMask.pair_.c_ = 0;
+  mhnMask.pair_.r_ = 0;
+  mhnMask.pair_.c_ = 0;
+  objMask.obj_ = this;
+  graMask.gra_ = Grammar();
+  mhnMask.mhn_ = GetMemHandler();
+  int mode = Mode();
+  int size = sizeof(this);
+  int pageNum = GetPageNum();
+  sprintf(address, "%X:%X:%X:%X:%X:%X:%X:%X:%X",
+    objMask.pair_.r_,
+    objMask.pair_.c_,
+    graMask.pair_.r_,
+    graMask.pair_.c_,
+    mhnMask.pair_.r_,
+    mhnMask.pair_.c_,
+    mode,
+    size,
+    pageNum);
+  return(BText(address));
+}
Index: tol/btol/bgrammar/tol_bsyntax.h
===================================================================
--- tol/btol/bgrammar/tol_bsyntax.h	(revision 510f3f813717b731584e55ba60bf6edad8106aeb)
+++ tol/btol/bgrammar/tol_bsyntax.h	(revision 7d06d2f7c7411a94ebb7bea8169117183893edeb)
@@ -319,4 +319,6 @@
   #endif
 
+  static BSyntaxObject* GetObjectFromAddress(const BText& address);
+  BText GetAddressFromObject() const;
 
 #ifndef FOR_BTOLLNK
Index: tol/btol/text_type/txtgra.cpp
===================================================================
--- tol/btol/text_type/txtgra.cpp	(revision 510f3f813717b731584e55ba60bf6edad8106aeb)
+++ tol/btol/text_type/txtgra.cpp	(revision 7d06d2f7c7411a94ebb7bea8169117183893edeb)
@@ -1035,4 +1035,23 @@
 {
   contens_ = Arg(1)->TolPath();
+}
+
+//--------------------------------------------------------------------
+DeclareContensClass(BText, BTxtTemporary, BTxtGetAddressFromObject);
+DefExtOpr(1, BTxtGetAddressFromObject, "GetAddressFromObject",   1, 1, "Anything",
+	  "(Anything var)",
+	  I2("Returns a unique string address for a TOL variable that can "
+       "be used after to recover the object with GetObjectFromAddress "
+       "if it is still alive.",
+	     "Devuelve una cadena de dirección única para una variable TOL "
+       "que puede ser utilizada posterormente para recuperar el objeto "
+       "con GetObjectFromAddress si aún existe."),
+	  BOperClassify::General_);
+
+//--------------------------------------------------------------------
+void BTxtGetAddressFromObject::CalcContens()
+//--------------------------------------------------------------------
+{
+  contens_ = Arg(1)->GetAddressFromObject();
 }
 
