diff --git a/parallel/ddd/basic/ooppcc.h b/parallel/ddd/basic/ooppcc.h
index b8d97ab71271754d8721c7c3a37f4af483337873..22e333130c4b9c75bb7203b8af756d12cea6d8e1 100644
--- a/parallel/ddd/basic/ooppcc.h
+++ b/parallel/ddd/basic/ooppcc.h
@@ -46,113 +46,6 @@ typedef PtrOf * CPtr;
 #endif
 /****************************************************************************/
 
-
-
-
-/****************************************************************************/
-#ifdef ArrayOf
-/****************************************************************************/
-
-#define Array(T)   CN(CCAT(T,Array))
-
-/* class name for array */
-#define CArray     CCAT(ArrayOf,Array)
-
-
-#ifndef ArrayAllocate
-/* define default allocate function */
-#define ArrayAllocate OO_Allocate
-#endif
-
-#ifndef ArrayFree
-/* define default free function */
-#define ArrayFree OO_Free
-#endif
-
-
-/*** array class ***/
-
-#define ClassName CArray
-Class_Data_Begin
-CN(ArrayOf) *data;
-int size;
-int used;
-Class_Data_End
-Method_New_     (int _NEWPARAMS);
-void         Method(Free)    (DefThis);
-CN(ArrayOf) *Method(GetData) (DefThis);
-int          Method(GetSize) (DefThis);
-
-
-#ifdef ContainerImplementation
-Method_New_ (int size _NEWPARAMS)
-{
-  Construct(This, _CHECKALLOC(This));
-
-  if (size==0)
-  {
-    This->data = NULL;
-  }
-  else
-  {
-    This->data = (CN(ArrayOf) *)ArrayAllocate (sizeof(CN(ArrayOf))*size);
-    if (This->data==NULL)
-    {
-      Destruct(This);
-      return(NULL);
-    }
-  }
-
-  This->size = size;
-  This->used = 0;
-
-  return(This);
-}
-
-
-void Method(Free) (ParamThis)
-{
-  if (This==NULL)
-    return;
-
-#ifndef NoArrayFree
-  if (This->data!=NULL)
-    ArrayFree (This->data);
-#endif
-
-  Destruct(This);
-}
-
-
-CN(ArrayOf) *Method(GetData) (ParamThis)
-{
-  return(This->data);
-}
-
-
-int Method(GetSize) (ParamThis)
-{
-  return(This->size);
-}
-
-#endif
-
-#undef ClassName
-
-
-/****************************************************************************/
-#undef ArrayAllocate
-#undef ArrayFree
-#ifdef NoArrayFree
-        #undef NoArrayFree
-#endif
-#undef CArray
-#undef ArrayOf
-#endif
-/****************************************************************************/
-
-
-
 /****************************************************************************/
 #ifdef SegmListOf
 /****************************************************************************/
@@ -510,10 +403,6 @@ typedef CN (CListItem) * ListIter (ListOf);
 #define CBTreeNode  CCAT(BTreeOf,BTreeNode)
 #define CBTree      CCAT(BTreeOf,BTree)
 
-/* this is the corresponding pointer-array class */
-#define CPtrArray   CCAT(CN(BTreeOf),PtrArray)
-
-
 /* method pointers */
 #define Iterate_Method         CCAT(BTreeOf,IterateMethod)
 typedef void (*Iterate_Method)(CN(BTreeOf) *);
@@ -850,7 +739,7 @@ void         Method(Print)    (DefThis _PRINTPARAMS);
 void         Method(Reset)    (DefThis);
 int          Method(Insert)   (DefThis, CN(BTreeOf) *);
 void         Method(Iterate)  (DefThis, Iterate_Method);
-CPtrArray   *Method(GetArray) (DefThis);
+std::vector<BTreeOf*> Method(GetArray) (DefThis);
 void         Method(GetResources)  (DefThis, int *, int *, size_t *, size_t *);
 
 
@@ -924,25 +813,16 @@ void Method(Iterate) (ParamThis, Iterate_Method iter_method)
 }
 
 
-CPtrArray *Method(GetArray) (ParamThis)
+std::vector<BTreeOf*> Method(GetArray) (ParamThis)
 {
-  CPtrArray  *array;
-  CN(BTreeOf) **ptr;
-
-  array = CALL(New,CPtrArray) (This->nItems);
+  std::vector<BTreeOf*> array(This->nItems);
 
-  /* if no items exist, we return empty array. */
-  if (This->nItems==0) return(array);
-
-
-  /* if there are items, but New returns NULL, we ran out of
-     memory. we return NULL to the caller in this case. */
-  if (array==NULL) return(NULL);
-
-  ptr = CALL(CPtrArray,GetData) (array);
-  CALL(CBTreeNode,Linearize) (This->root, ptr);
+  if (This->nItems != 0) {
+    BTreeOf** ptr = array.data();
+    CALL(CBTreeNode,Linearize) (This->root, ptr);
+  }
 
-  return(array);
+  return array;
 }
 
 
@@ -970,7 +850,6 @@ void Method(GetResources) (ParamThis,
 
 
 /****************************************************************************/
-#undef CPtrArray
 #undef CBTreeNode
 #undef CBTree
 /*#undef Compare_Method*/
@@ -1007,7 +886,6 @@ void Method(GetResources) (ParamThis,
 
 /* instantiate all template types we will need lateron */
 #define PtrOf      SetOf
-#define ArrayOf    CCAT(SetOf,Ptr)
 #define SegmListOf SetOf
 #define SegmSize   Set_SegmSize
 #define BTreeOf    SetOf
@@ -1025,7 +903,6 @@ void Method(GetResources) (ParamThis,
 #define CSet       CCAT(SetOf,Set)
 #define CSegmList  CCAT(SetOf,SegmList)
 #define CBTree     CCAT(SetOf,BTree)
-#define CPtrArray  CCAT(CN(SetOf),PtrArray)
 
 
 /*** Set class ***/
@@ -1044,7 +921,7 @@ CN(SetOf)   *Method(NewItem)  (DefThis);
 int          Method(ItemOK)   (DefThis);
 int          Method(GetNItems)     (DefThis);
 int          Method(GetNDiscarded) (DefThis);
-CPtrArray   *Method(GetArray) (DefThis);
+std::vector<SetOf*> Method(GetArray) (DefThis);
 void    Method(GetResources)  (DefThis, int *, int *, int *, size_t *, size_t *);
 
 
@@ -1111,7 +988,7 @@ int Method(GetNDiscarded) (ParamThis)
 }
 
 
-CPtrArray *Method(GetArray) (ParamThis)
+std::vector<SetOf*> Method(GetArray) (ParamThis)
 {
   return(CALL(CBTree,GetArray) (This->tree));
 }
@@ -1145,7 +1022,6 @@ void Method(GetResources) (ParamThis,
 /****************************************************************************/
 #undef CSegmList
 #undef CBTree
-#undef CPtrArray
 #undef CSet
 #undef SetOf
 #endif
diff --git a/parallel/ddd/basic/test/testbtree.cc b/parallel/ddd/basic/test/testbtree.cc
index 24a7805503bc8e1c2154d18c431a039554a4cd56..58d344c71919f461b8f7ec3364a5a166e2638d07 100644
--- a/parallel/ddd/basic/test/testbtree.cc
+++ b/parallel/ddd/basic/test/testbtree.cc
@@ -5,6 +5,7 @@
 #include <cstdio>
 #include <cstdlib>
 #include <cassert>
+#include <vector>
 
 /* some macros for customizing oopp */
 #define _NEWPARAMS
@@ -44,10 +45,6 @@ int  Method(Compare) (ClassPtr, ClassPtr);
 #define SetOf          TestTreeElement
 #define Set_SegmSize   256
 #define Set_BTreeOrder 32
-#ifdef XferMemFromHeap
-#define ArrayAllocate  xfer_AllocHeap
-#define NoArrayFree
-#endif
 #endif
 
 // Create method definitions, not just declarations
diff --git a/parallel/ddd/join/jcmds.cc b/parallel/ddd/join/jcmds.cc
index 1d78ba5bbfb20e55e4f79fe4e9ae4a7d3e33a583..03fbd3053595b15d84bf351aff9b09b8d7ecdf6f 100644
--- a/parallel/ddd/join/jcmds.cc
+++ b/parallel/ddd/join/jcmds.cc
@@ -114,12 +114,12 @@ static int sort_Gid (const void *e1, const void *e2)
 
  */
 
-static int PreparePhase1Msgs (JIJoinPtrArray *arrayJoin,
+static int PreparePhase1Msgs (std::vector<JIJoin*>& arrayJoin,
                               JOINMSG1 **theMsgs, size_t *memUsage)
 {
   int i, last_i, nMsgs;
-  JIJoin   **itemsJ = JIJoinPtrArray_GetData(arrayJoin);
-  int nJ       = JIJoinPtrArray_GetSize(arrayJoin);
+  JIJoin** itemsJ = arrayJoin.data();
+  const int nJ = arrayJoin.size();
 
 #       if DebugJoin<=3
   printf("%4d: PreparePhase1Msgs, nJoins=%d\n",
@@ -410,12 +410,12 @@ static void UnpackPhase1Msgs (LC_MSGHANDLE *theMsgs, int nRecvMsgs,
 
  */
 
-static int PreparePhase2Msgs (JIAddCplPtrArray *arrayAddCpl,
+static int PreparePhase2Msgs (std::vector<JIAddCpl*>& arrayAddCpl,
                               JOINMSG2 **theMsgs, size_t *memUsage)
 {
   int i, last_i, nMsgs;
-  JIAddCpl **itemsAC = JIAddCplPtrArray_GetData(arrayAddCpl);
-  int nAC       = JIAddCplPtrArray_GetSize(arrayAddCpl);
+  JIAddCpl** itemsAC = arrayAddCpl.data();
+  const int nAC = arrayAddCpl.size();
 
 #       if DebugJoin<=3
   printf("%4d: PreparePhase2Msgs, nAddCpls=%d\n",
@@ -603,12 +603,12 @@ static void UnpackPhase2Msgs (LC_MSGHANDLE *theMsgs2, int nRecvMsgs2,
 
  */
 
-static int PreparePhase3Msgs (JIAddCplPtrArray *arrayAddCpl,
+static int PreparePhase3Msgs (std::vector<JIAddCpl*>& arrayAddCpl,
                               JOINMSG3 **theMsgs, size_t *memUsage)
 {
   int i, last_i, nMsgs;
-  JIAddCpl **itemsAC = JIAddCplPtrArray_GetData(arrayAddCpl);
-  int nAC       = JIAddCplPtrArray_GetSize(arrayAddCpl);
+  JIAddCpl** itemsAC = arrayAddCpl.data();
+  const int nAC = arrayAddCpl.size();
 
 #       if DebugJoin<=3
   printf("%4d: PreparePhase3Msgs, nAddCpls=%d\n",
@@ -727,10 +727,10 @@ static void PackPhase3Msgs (JOINMSG3 *theMsgs)
  */
 
 static void UnpackPhase3Msgs (LC_MSGHANDLE *theMsgs, int nRecvMsgs,
-                              JIJoinPtrArray *arrayJoin)
+                              std::vector<JIJoin*>& arrayJoin)
 {
-  JIJoin   **itemsJ = JIJoinPtrArray_GetData(arrayJoin);
-  int nJ       = JIJoinPtrArray_GetSize(arrayJoin);
+  JIJoin** itemsJ = arrayJoin.data();
+  const int nJ = arrayJoin.size();
   int m;
 
 
@@ -786,9 +786,6 @@ static void UnpackPhase3Msgs (LC_MSGHANDLE *theMsgs, int nRecvMsgs,
 
 DDD_RET DDD_JoinEnd (void)
 {
-  JIJoinPtrArray   *arrayJIJoin    = NULL;
-  JIAddCplPtrArray *arrayJIAddCpl2 = NULL;
-  JIAddCplPtrArray *arrayJIAddCpl3 = NULL;
   int obsolete, nRecvMsgs1, nRecvMsgs2, nRecvMsgs3;
   JOINMSG1    *sendMsgs1=NULL, *sm1=NULL;
   JOINMSG2    *sendMsgs2=NULL, *sm2=NULL;
@@ -822,7 +819,7 @@ DDD_RET DDD_JoinEnd (void)
           PREPARATION PHASE
    */
   /* get sorted array of JIJoin-items */
-  arrayJIJoin = JIJoinSet_GetArray(joinGlobals.setJIJoin);
+  std::vector<JIJoin*> arrayJIJoin = JIJoinSet_GetArray(joinGlobals.setJIJoin);
   obsolete = JIJoinSet_GetNDiscarded(joinGlobals.setJIJoin);
 
 
@@ -941,7 +938,7 @@ DDD_RET DDD_JoinEnd (void)
           for which Joins had been issued remotely.
    */
   /* get sorted array of JIAddCpl-items */
-  arrayJIAddCpl2 = JIAddCplSet_GetArray(joinGlobals.setJIAddCpl2);
+  std::vector<JIAddCpl*> arrayJIAddCpl2 = JIAddCplSet_GetArray(joinGlobals.setJIAddCpl2);
 
   STAT_RESET;
   /* prepare msgs for JIAddCpl-items */
@@ -963,11 +960,12 @@ DDD_RET DDD_JoinEnd (void)
 
   /* reorder Join-commands according to new_gid */
   /* this ordering is needed in UnpackPhase3 */
-  if (JIJoinPtrArray_GetSize(arrayJIJoin) > 1)
+  if (arrayJIJoin.size() > 1)
   {
+    // TODO: use std::sort
     qsort(
-      JIJoinPtrArray_GetData(arrayJIJoin),
-      JIJoinPtrArray_GetSize(arrayJIJoin),
+      arrayJIJoin.data(),
+      arrayJIJoin.size(),
       sizeof(JIJoin *), sort_NewGid);
   }
 
@@ -1049,7 +1047,7 @@ DDD_RET DDD_JoinEnd (void)
           on which the JoinObj-commands have been issued.
    */
   /* get sorted array of JIAddCpl-items */
-  arrayJIAddCpl3 = JIAddCplSet_GetArray(joinGlobals.setJIAddCpl3);
+  std::vector<JIAddCpl*> arrayJIAddCpl3 = JIAddCplSet_GetArray(joinGlobals.setJIAddCpl3);
 
   STAT_RESET;
   /* prepare msgs for JIAddCpl-items */
@@ -1137,13 +1135,10 @@ DDD_RET DDD_JoinEnd (void)
   /*
           free temporary storage
    */
-  JIJoinPtrArray_Free(arrayJIJoin);
   JIJoinSet_Reset(joinGlobals.setJIJoin);
 
-  JIAddCplPtrArray_Free(arrayJIAddCpl2);
   JIAddCplSet_Reset(joinGlobals.setJIAddCpl2);
 
-  JIAddCplPtrArray_Free(arrayJIAddCpl3);
   JIAddCplSet_Reset(joinGlobals.setJIAddCpl3);
 
   if (localCplObjs!=NULL) FreeTmp(localCplObjs, 0);
diff --git a/parallel/ddd/join/join.h b/parallel/ddd/join/join.h
index 7c27dc69400215a0536244ebdf4b6d3acf838c3c..48bdc66d0c4d263632deb587220079df5dac1d41 100644
--- a/parallel/ddd/join/join.h
+++ b/parallel/ddd/join/join.h
@@ -32,6 +32,7 @@
 #ifndef __JOIN_H__
 #define __JOIN_H__
 
+#include <vector>
 
 #define DebugJoin     10   /* 0 is all, 10 is off */
 
diff --git a/parallel/ddd/xfer/cmdmsg.cc b/parallel/ddd/xfer/cmdmsg.cc
index 6668d96f75e5a5366e3a7cb98e89c8e8d6230e3a..5fbf11690ca56af65b7c74bdcd4448dcbb9d65d3 100644
--- a/parallel/ddd/xfer/cmdmsg.cc
+++ b/parallel/ddd/xfer/cmdmsg.cc
@@ -469,16 +469,15 @@ static void CmdMsgDisplay (const char *comment, LC_MSGHANDLE xm)
 
 int PruneXIDelCmd (
   XIDelCmd  **itemsDC, int nDC,
-  XICopyObjPtrArray *arrayCO)
+  std::vector<XICopyObj*>& arrayCO)
 {
   CMDMSG    *sendMsgs, *sm=0;
   LC_MSGHANDLE *recvMsgs;
   int nSendMsgs, nRecvMsgs;
   int nPruned;
 
-  XICopyObj **itemsCO = XICopyObjPtrArray_GetData(arrayCO);
-  int nCO       = XICopyObjPtrArray_GetSize(arrayCO);
-
+  XICopyObj** itemsCO = arrayCO.data();
+  const int nCO = arrayCO.size();
 
   /* accumulate messages (one for each partner) */
   nSendMsgs = PrepareCmdMsgs(itemsCO, nCO, &sendMsgs);
diff --git a/parallel/ddd/xfer/cmds.cc b/parallel/ddd/xfer/cmds.cc
index 7de044fd7f9061c8c2851c6eeca8bc29901cfc3e..3df28f5a924814d406a763584655a21526251baa 100644
--- a/parallel/ddd/xfer/cmds.cc
+++ b/parallel/ddd/xfer/cmds.cc
@@ -397,13 +397,12 @@ static void DisplayMemResources (void)
 DDD_RET DDD_XferEnd (void)
 {
   DDD_RET ret_code              = DDD_RET_OK;
-  XICopyObjPtrArray *arrayXICopyObj = NULL;
   XICopyObj   **arrayNewOwners      = NULL;
   int nNewOwners;
   XIDelCmd    **arrayXIDelCmd       = NULL;
   int remXIDelCmd, prunedXIDelCmd;
   XIDelObj    **arrayXIDelObj       = NULL;
-  XISetPrioPtrArray *arrayXISetPrio = NULL;
+  std::vector<XISetPrio*> arrayXISetPrio;
   XINewCpl    **arrayXINewCpl       = NULL;
   XIOldCpl    **arrayXIOldCpl       = NULL;
   XIDelCpl    **arrayXIDelCpl       = NULL;
@@ -434,14 +433,7 @@ DDD_RET DDD_XferEnd (void)
    */
   STAT_RESET;
   /* get sorted array of XICopyObj-items */
-  arrayXICopyObj = XICopyObjSet_GetArray(xferGlobals.setXICopyObj);
-  if (arrayXICopyObj==NULL)
-  {
-    DDD_PrintError('W', 6080, "out of memory in DDD_XferEnd(), giving up.");
-    ret_code = DDD_RET_ERROR_NOMEM;
-    LC_Abort(EXCEPTION_LOWCOMM_USER);
-    goto exit;
-  }
+  std::vector<XICopyObj*> arrayXICopyObj = XICopyObjSet_GetArray(xferGlobals.setXICopyObj);
   obsolete = XICopyObjSet_GetNDiscarded(xferGlobals.setXICopyObj);
 
   /* debugging output, write all XICopyObjs to file
@@ -605,13 +597,6 @@ DDD_RET DDD_XferEnd (void)
   /* create sorted array of XISetPrio-items, and unify it */
   STAT_RESET;
   arrayXISetPrio = XISetPrioSet_GetArray(xferGlobals.setXISetPrio);
-  if (arrayXISetPrio==NULL)
-  {
-    DDD_PrintError('W', 6087, "out of memory in DDD_XferEnd(), giving up.");
-    LC_Cleanup();
-    ret_code = DDD_RET_ERROR_NOMEM;
-    goto exit;
-  }
   obsolete += XISetPrioSet_GetNDiscarded(xferGlobals.setXISetPrio);
 
 
@@ -793,13 +778,11 @@ DDD_RET DDD_XferEnd (void)
 exit:
 
   /* free temporary storage */
-  XICopyObjPtrArray_Free(arrayXICopyObj);
   XICopyObjSet_Reset(xferGlobals.setXICopyObj);
 
   if (arrayNewOwners!=NULL) OO_Free (arrayNewOwners /*,0*/);
   FreeAllXIAddData();
 
-  XISetPrioPtrArray_Free(arrayXISetPrio);
   XISetPrioSet_Reset(xferGlobals.setXISetPrio);
 
   if (arrayXIDelCmd!=NULL) OO_Free (arrayXIDelCmd /*,0*/);
diff --git a/parallel/ddd/xfer/unpack.cc b/parallel/ddd/xfer/unpack.cc
index b9c215e70c1ff545df92f7033e30dd6a5f2ad862..eb3d4cbe52dc9e08a576b4e6692f61e0a923e15c 100644
--- a/parallel/ddd/xfer/unpack.cc
+++ b/parallel/ddd/xfer/unpack.cc
@@ -1513,17 +1513,17 @@ static int CompressNewCpl (TENewCpl *tabNC, int nNC)
 
 void XferUnpack (LC_MSGHANDLE *theMsgs, int nRecvMsgs,
                  const DDD_HDR *localCplObjs, int nLocalCplObjs,
-                 XISetPrioPtrArray *theSP,
+                 std::vector<XISetPrio*>& theSP,
                  XIDelObj **arrayDO, int nDO,
-                 XICopyObjPtrArray *arrayCO,
+                 const std::vector<XICopyObj*>& arrayCO,
                  XICopyObj **arrayNewOwners, int nNewOwners)
 {
   TENewCpl     *allNewCpl;
   OBJTAB_ENTRY **unionObjTab;
   int lenObjTab, lenSymTab, nNewCpl;
   int i, pos1, pos2, len;
-  XISetPrio    **arraySP = XISetPrioPtrArray_GetData(theSP);
-  int nSP       = XISetPrioPtrArray_GetSize(theSP);
+  XISetPrio** arraySP = theSP.data();
+  const int nSP = theSP.size();
 
 
 
diff --git a/parallel/ddd/xfer/xfer.cc b/parallel/ddd/xfer/xfer.cc
index c7df057e360378f27d130343d20a1b9b54e6df12..a4a22a260718f44bdc8adf38d8752735fea85e32 100644
--- a/parallel/ddd/xfer/xfer.cc
+++ b/parallel/ddd/xfer/xfer.cc
@@ -112,12 +112,12 @@ static int sort_NewOwners (const void *e1, const void *e2)
         XFER-P and XFER-D).
  */
 
-XICopyObj **CplClosureEstimate (XICopyObjPtrArray *arrayItems, int *nRet)
+XICopyObj **CplClosureEstimate (const std::vector<XICopyObj*>& arrayItems, int *nRet)
 {
   int i, nNewOwners;
   XICopyObj **arrayNewOwners = NULL;
-  XICopyObj **items = XICopyObjPtrArray_GetData(arrayItems);
-  int n       = XICopyObjPtrArray_GetSize(arrayItems);
+  XICopyObj* const* items = arrayItems.data();
+  const int n = arrayItems.size();
 
 
 
@@ -513,7 +513,7 @@ static XFERMSG *AccumXIOldCpl (XFERMSG *currxm, int *nMsgs, int *nItems,
         coupling closure from CplClosureEstimate().
  */
 
-int PrepareObjMsgs (XICopyObjPtrArray *arrayO,
+int PrepareObjMsgs (std::vector<XICopyObj*>& arrayO,
                     XINewCpl **itemsNC, int nNC,
                     XIOldCpl **itemsOC, int nOC,
                     XFERMSG **theMsgs, size_t *memUsage)
@@ -521,8 +521,8 @@ int PrepareObjMsgs (XICopyObjPtrArray *arrayO,
   XFERMSG    *xm=NULL;
   int iO, iNC, iOC, nMsgs=0;
 
-  XICopyObj  **itemsO = XICopyObjPtrArray_GetData(arrayO);
-  int nO       = XICopyObjPtrArray_GetSize(arrayO);
+  XICopyObj** itemsO = arrayO.data();
+  const int nO = arrayO.size();
 
 
 #       if DebugXfer<=3
@@ -622,13 +622,13 @@ int PrepareObjMsgs (XICopyObjPtrArray *arrayO,
         procs during first message phase.
  */
 void ExecLocalXISetPrio (
-  XISetPrioPtrArray *arrayP,
+  const std::vector<XISetPrio*>& arrayP,
   XIDelObj  **itemsD, int nD,
   XICopyObj  **itemsNO, int nNO)
 {
   int iP, iD, iNO;
-  XISetPrio **itemsP = XISetPrioPtrArray_GetData(arrayP);
-  int nP       = XISetPrioPtrArray_GetSize(arrayP);
+  XISetPrio* const* itemsP = arrayP.data();
+  const int nP = arrayP.size();
 
   /*
           execute SetPrio only if no corresponding DelObj exists!
diff --git a/parallel/ddd/xfer/xfer.h b/parallel/ddd/xfer/xfer.h
index a5721b3dbec7d27f6f7107af128c94acb343d21d..855350726b91b1c6143968e814abb43f09a8e699 100644
--- a/parallel/ddd/xfer/xfer.h
+++ b/parallel/ddd/xfer/xfer.h
@@ -33,6 +33,7 @@
 #ifndef __XFER_H__
 #define __XFER_H__
 
+#include <vector>
 
 #define DebugXfer     10   /* 0 is all, 10 is off */
 #define DebugPack     6    /* off: 6 */
@@ -176,10 +177,6 @@ int  Method(Compare) (ClassPtr, ClassPtr);
 #define SetOf          XICopyObj
 #define Set_SegmSize   256
 #define Set_BTreeOrder 32
-#ifdef XferMemFromHeap
-#define ArrayAllocate  xfer_AllocHeap
-#define NoArrayFree
-#endif
 #endif
 #include "basic/ooppcc.h"
 
@@ -261,10 +258,6 @@ int  Method(Compare) (ClassPtr, ClassPtr);
 #define SetOf          XISetPrio
 #define Set_SegmSize   256
 #define Set_BTreeOrder 32
-#ifdef XferMemFromHeap
-#define ArrayAllocate  xfer_AllocHeap
-#define NoArrayFree
-#endif
 #endif
 #include "basic/ooppcc.h"
 
@@ -605,17 +598,17 @@ void CplMsgExit (void);
 
 
 /* cmdmsg.c */
-int  PruneXIDelCmd (XIDelCmd **, int, XICopyObjPtrArray *);
+int  PruneXIDelCmd (XIDelCmd **, int, std::vector<XICopyObj*>&);
 void CmdMsgInit (void);
 void CmdMsgExit (void);
 
 
 /* xfer.c, used only by cmds.c */
-XICopyObj **CplClosureEstimate(XICopyObjPtrArray *, int *);
-int  PrepareObjMsgs(XICopyObjPtrArray *, XINewCpl **, int,
+XICopyObj **CplClosureEstimate(const std::vector<XICopyObj*>&, int *);
+int  PrepareObjMsgs(std::vector<XICopyObj*>&, XINewCpl **, int,
                     XIOldCpl **, int, XFERMSG **, size_t *);
 void ExecLocalXIDelCmd(XIDelCmd  **, int);
-void ExecLocalXISetPrio(XISetPrioPtrArray *, XIDelObj  **,int, XICopyObj **,int);
+void ExecLocalXISetPrio(const std::vector<XISetPrio*>&, XIDelObj  **,int, XICopyObj **,int);
 void ExecLocalXIDelObj(XIDelObj  **, int, XICopyObj **,int);
 void PropagateCplInfos(XISetPrio **, int, XIDelObj  **, int,
                        TENewCpl *, int);
@@ -629,8 +622,8 @@ RETCODE XferPackMsgs (XFERMSG *);
 
 /* unpack.c, used only by cmds.c */
 void XferUnpack (LC_MSGHANDLE *, int, const DDD_HDR *, int,
-                 XISetPrioPtrArray *, XIDelObj  **, int,
-                 XICopyObjPtrArray *, XICopyObj **, int);
+                 std::vector<XISetPrio*>&, XIDelObj  **, int,
+                 const std::vector<XICopyObj*>&, XICopyObj **, int);
 
 
 /* ctrl.c */