diff --git a/src/fpga.cpp b/src/fpga.cpp
index e447b5ba84b4e66a84e2ff5d1dadbbdd0b842f1e..e3dc21337be9408ee59b08bca1c0008949c85256 100644
--- a/src/fpga.cpp
+++ b/src/fpga.cpp
@@ -223,7 +223,7 @@ CPointMap * Fpga::get_pointMap(void)
 }
 
 bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
-                 const unsigned int *data, const int nvalues)
+                 const char *data, const int nvalues)
 {
     bool ret, retval = false;
     uint mask_cnt = 0;
@@ -276,7 +276,7 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
         try {
             uint didx = 0;
             if (cmd == 'W') {
-                didx = idx * nof_values * reg_format_size_in_words(format);
+                didx = idx * nof_values * reg_format_size_in_bytes(format);
             }
             if ((ret = node->exec_cmd(cmd, relative_addr, type, instance,
                                       &data[didx], nof_values, format))) {
diff --git a/src/fpga.h b/src/fpga.h
index 14f62ec1d3a79dc84cdcfaf38e264d6f10b14ba5..5bbd57c057aadc1dbc3d64576d57429ae9fe920e 100644
--- a/src/fpga.h
+++ b/src/fpga.h
@@ -49,7 +49,7 @@ public:
     ~Fpga();
 
     bool point(TermOutput& termout, const char cmd, const std::string addr,
-               const unsigned int *data, const int len);
+               const char *data, const int len);
 
     Node * select_node(const int nr);
     std::vector<int> get_all_nodes(void);
diff --git a/src/map.cpp b/src/map.cpp
index d584a8111c5feb41cb2abb7e2b36a51165a0b053..ad1ec61ede5cab494bab72a401fc987f5eeb3f78 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -66,7 +66,7 @@ bool UniboardMap::read(TermOutput& termout,
 
 bool UniboardMap::write(TermOutput& termout,
                         const string addr,
-                        const unsigned int *data,
+                        const char *data,
                         const int nvalues)
 {
     bool retval = false;
diff --git a/src/map.h b/src/map.h
index 051be34cc831cc6b1c791c3b70c016ac706dbb1f..b2d021a928fd72ae7c2924e3d4fec81d58d4f058 100644
--- a/src/map.h
+++ b/src/map.h
@@ -54,7 +54,7 @@ bool is_initialized(void) { return initialized; }
 bool init(TermOutput& termout);
 
 bool write(TermOutput& termout, const std::string addr,
-           const unsigned int *data, const int nvalues);
+           const char *data, const int nvalues);
 
 bool read(TermOutput& termout, const std::string addr,
           const int nvalues);
diff --git a/src/node.cpp b/src/node.cpp
index 64cbe881e456f63fc982798ac02ed1c29832bb3a..388c87d56e6b102d2982e9689f3d43bc22d750f5 100644
--- a/src/node.cpp
+++ b/src/node.cpp
@@ -112,11 +112,15 @@ void Node::worker()
                 case 'R': {  // read
                     if (strcmp(p->type, "fpga") == 0 || strcmp(p->type, "mm") == 0) {
                         r.retval = periph_fpga->read(termout, p->relative_addr, p->type, p->data, p->nvalues, p->format);
+                        r.nof_vals = termout.nof_vals;
+                        r.datatype = termout.datatype;
                     }
                 } break;
                 case 'W': {  // write
                     if (strcmp(p->type, "fpga") == 0 || strcmp(p->type, "mm") == 0) {
                         r.retval = periph_fpga->write(termout, p->relative_addr, p->type, p->data, p->nvalues, p->format);
+                        r.nof_vals = p->nvalues;
+                        r.datatype = p->format;
                     }
                 } break;
                 default: {
@@ -132,8 +136,8 @@ void Node::worker()
             r.retval = 0;
             //cerr << "Node::worker '...' exception" << endl;
         }
-        r.nof_vals = termout.nof_vals;
-        r.datatype = termout.datatype;
+        // r.nof_vals = termout.nof_vals;
+        // r.datatype = termout.datatype;
 
         // cout << " p.relative_addr=" << p->relative_addr << endl;
         // cout << " p.type=" << p->type << endl;
@@ -151,10 +155,10 @@ void Node::worker()
         
         reply_queue.Push(outbuf);
     }
-    cout << "Node::worker job"
-         << " Uniboard=" << UniboardNr
-         << " New node IP=" << myIPaddr
-         << " leaving!!" << endl;
+    // cout << "Node::worker job"
+    //      << " Uniboard=" << UniboardNr
+    //      << " New node IP=" << myIPaddr
+    //      << " leaving!!" << endl;
 }
 
 Node::Node(const string ipaddr, const uint unb, const uint localnr, const string type,
@@ -259,7 +263,7 @@ uint32_t Node::ppsOffsetCnt(void) {
 
 
 bool Node::exec_cmd(const char cmd, const string relative_addr,
-                    const string type, const string instance, const unsigned int *data,
+                    const string type, const string instance, const char *data,
                     const int nvalues, const int format)
 {
     pread_cmd_struct p;
@@ -271,10 +275,10 @@ bool Node::exec_cmd(const char cmd, const string relative_addr,
     p.nvalues = nvalues;
     p.format = format;
     if (cmd == 'W') {
-        memcpy((void *)p.data, (void *)data, nvalues*reg_format_size_in_words(format)*4);
+        memcpy((void *)p.data, (void *)data, nvalues*reg_format_size_in_bytes(format));
         // cout << " p.relative_addr=" << p.relative_addr 
         //      << " p.nvalues=" << p.nvalues
-        //      << " p.format=" << p.format;
+        //      << " p.format=" << p.format << endl;
     }
 
     array<unsigned char, cmd_buf_size> outbuf;
diff --git a/src/node.h b/src/node.h
index 4006e2924fa4eb044d7c24013f3a68adf862a0d7..cdd8568deb98281aad1a6007c067373533488ca3 100644
--- a/src/node.h
+++ b/src/node.h
@@ -101,7 +101,7 @@ class Node {
 
   void worker();
   bool exec_cmd(const char cmd, const std::string relative_addr,
-                const std::string type, const std::string instance, const unsigned int *data,
+                const std::string type, const std::string instance, const char *data,
                 const int nvalues, const int format);
   bool exec_reply(TermOutput& t);
 
diff --git a/src/opcua/ua_server.cpp b/src/opcua/ua_server.cpp
index e56d50cdb3dc39efee93ad82505412bf38a5a1fb..9cc9cef850d0989993627f3abf980cb7eca46206 100644
--- a/src/opcua/ua_server.cpp
+++ b/src/opcua/ua_server.cpp
@@ -128,168 +128,45 @@ static UA_StatusCode ua_read_DataSource(UA_Server *server,
         cerr << "ua_read_DataSource error: " << e.what() << endl;
     }
 
+    
+    uint type = ntype.identifier.numeric - 1;
+    uint32_t sz;
     // if scalar (only TR_* points)
     if (termout.nof_vals == 1) {
-        switch (ntype.identifier.numeric - 1) {
-            case UA_TYPES_STRING: {
-                char *ptr = (char *)termout.val;
-                UA_String value = UA_STRING_ALLOC((char *)ptr);
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_STRING]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_FLOAT: {
-                float *ptr = (float *)termout.val;
-                UA_Float value = (UA_Float)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_FLOAT]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_DOUBLE: {
-                double *ptr = (double *)termout.val;
-                UA_Double value = (UA_Double)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_DOUBLE]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_INT16: {
-                int16_t *ptr = (int16_t *)termout.val;
-                UA_Int16 value = (UA_Int16)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_INT16]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_UINT16: {
-                uint16_t *ptr = (uint16_t *)termout.val;
-                UA_UInt16 value = (UA_UInt16)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_UINT16]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_INT32: {
-                int32_t *ptr = (int32_t *)termout.val;
-                UA_Int32 value = (UA_Int32)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_INT32]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_UINT32: {
-                uint32_t *ptr = (uint32_t *)termout.val;
-                UA_UInt32 value = (UA_UInt32)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_UINT32]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_INT64: {
-                int64_t *ptr = (int64_t *)termout.val;
-                UA_Int64 value = (UA_Int64)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_INT64]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_UINT64: {
-                uint64_t *ptr = (uint64_t *)termout.val;
-                UA_UInt64 value = (UA_UInt64)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_UINT64]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_BOOLEAN: {
-                bool *ptr = (bool *)termout.val;
-                UA_Boolean value = (UA_Boolean)ptr[0];
-                UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_BOOLEAN]);
-                dataValue->hasValue = true;
-            } break;
-            default: {
-                dataValue->hasValue = false;
-            } break;
+        if (type == UA_TYPES_STRING) {
+            char *ptr = (char *)termout.val;
+            UA_String value = UA_STRING_ALLOC((char *)ptr);
+            UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_STRING]);
+            dataValue->hasValue = true;
+        }
+        else {
+            UA_Variant_setScalarCopy(&dataValue->value, termout.val, &UA_TYPES[type]);
+            dataValue->hasValue = true;
         }
     }
     // else array
     else {
-        switch (ntype.identifier.numeric - 1) {
-            case UA_TYPES_STRING: {
-                UA_String *values = (UA_String *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_STRING]);
-                char *ptr = (char *)termout.val;
-                for (unsigned int i=0; i<termout.nof_vals; i++) {
-                    values[i] = UA_STRING_ALLOC((char *)ptr);
-                    ptr += SIZE1STRING;
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_STRING]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_FLOAT: {
-                UA_Float *values = (UA_Float *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_FLOAT]);
-                float *ptr = (float *)termout.val;
-                for (unsigned int i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_Float(ptr[i]);
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_FLOAT]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_DOUBLE: {
-                UA_Double *values = (UA_Double *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_DOUBLE]);
-                double *ptr = (double *)termout.val;
-                for (unsigned int i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_Double(ptr[i]);
-                  //cout << i << " ptr=" << ptr[i] << " value=" << values[i] << endl;
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_DOUBLE]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_INT16: {
-                UA_Int16 *values = (UA_Int16 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_INT16]);
-                int16_t *ptr = (int16_t *)termout.val;
-                for (uint i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_Int16(ptr[i]);
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_INT16]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_UINT16: {
-                UA_UInt16 *values = (UA_UInt16 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_UINT16]);
-                uint16_t *ptr = (uint16_t *)termout.val;
-                for (uint i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_UInt16(ptr[i]);
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_UINT16]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_INT32: {
-                UA_Int32 *values = (UA_Int32 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_INT32]);
-                int32_t *ptr = (int32_t *)termout.val;
-                for (uint i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_Int32(ptr[i]);
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_INT32]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_UINT32: {
-                UA_UInt32 *values = (UA_UInt32 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_UINT32]);
-                uint32_t *ptr = (uint32_t *)termout.val;
-                for (uint i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_UInt32(ptr[i]);
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_UINT32]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_INT64: {
-                UA_Int64 *values = (UA_Int64 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_INT64]);
-                memcpy(values, termout.val, termout.nof_vals*sizeof(UA_Int64));
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_INT64]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_UINT64: {
-                UA_UInt64 *values = (UA_UInt64 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_UINT64]);
-                memcpy(values, termout.val, termout.nof_vals*sizeof(UA_UInt64));
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_UINT64]);
-                dataValue->hasValue = true;
-            } break;
-            case UA_TYPES_BOOLEAN: {
-                UA_Boolean *values = (UA_Boolean *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_BOOLEAN]);
-                bool *ptr = (bool *)termout.val;
-                for (unsigned int i=0; i<termout.nof_vals; i++) {
-                  values[i] = UA_Boolean(ptr[i]);
-                }
-                UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_BOOLEAN]);
-                dataValue->hasValue = true;
-            } break;
-            default: {
-                dataValue->hasValue = false;
-            } break;
+        if (type == UA_TYPES_STRING) {
+            UA_String *values = (UA_String *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_STRING]);
+            char *ptr = (char *)termout.val;
+            for (unsigned int i=0; i<termout.nof_vals; i++) {
+                values[i] = UA_STRING_ALLOC((char *)ptr);
+                ptr += SIZE1STRING;
+            }
+            UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_STRING]);
+            dataValue->hasValue = true;
         }
+        else {
+            void * values = UA_Array_new(termout.nof_vals, &UA_TYPES[type]);
+            
+            sz = termout.nof_vals * UA_TYPES[type].memSize;
+            memcpy(values, termout.val, sz);
+            UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[type]);
+            dataValue->hasValue = true;
+        }
+
     }
+   
     delete[] regname;
     return UA_STATUSCODE_GOOD;
 }
@@ -323,80 +200,29 @@ static UA_StatusCode ua_write_DataSource(UA_Server *server,
     if (data->hasValue && data->value.arrayLength > 0) {
         //data.value is of type UA_Variant.
         uint type = ntype.identifier.numeric - 1;
-        uint32_t *data_sdp;
+        char *data_sdp;
         uint32_t sz;
-        if ((type == UA_TYPES_DOUBLE) || (type == UA_TYPES_INT64) || (type == UA_TYPES_UINT64)) {
-            sz = data->value.arrayLength * 2;
-        } else if (type == UA_TYPES_STRING) {
-            sz = data->value.arrayLength * (SIZE1STRING / 4);
-        } else {
-            sz = data->value.arrayLength;
+        if (type == UA_TYPES_STRING) {
+            sz = data->value.arrayLength * SIZE1STRING;
+            data_sdp = new char[sz];
+            UA_String *dptr = (UA_String *)data->value.data;
+            UA_String str_data;
+            for (int i=0; i<(int)data->value.arrayLength; i++){
+                str_data = dptr[i];
+                memcpy((void *)&(data_sdp[i*SIZE1STRING]), (void *)str_data.data, str_data.length);
+            }
+            retval = true;
         }
-        data_sdp = new uint32_t[sz];
-        memset((void *)data_sdp, 0, sizeof(uint32_t)*sz);
-
-        retval = true;
-        switch (ntype.identifier.numeric - 1) {
-            case UA_TYPES_STRING: {
-                UA_String *dptr = (UA_String *)data->value.data;
-                UA_String str_data;
-                for (int i=0; i<(int)data->value.arrayLength; i++){
-                    str_data = dptr[i];
-                    memcpy((void *)&(data_sdp[i*(SIZE1STRING/4)]), (void *)str_data.data, str_data.length);
-                }
-            } break;
-            case UA_TYPES_FLOAT: {
-                memcpy(data_sdp, data->value.data, data->value.arrayLength*sizeof(UA_Float));
-            } break;
-            case UA_TYPES_DOUBLE: {
-                memcpy(data_sdp, data->value.data, data->value.arrayLength*sizeof(UA_Double));
-            } break;
-            case UA_TYPES_INT16: {
-                int16_t *dptr = (int16_t *)data->value.data;
-                for (uint i=0; i<data->value.arrayLength; i++) {
-                  data_sdp[i] = (uint32_t)dptr[i];
-                }
-            } break;
-            case UA_TYPES_UINT16: {
-                uint16_t *dptr = (uint16_t *)data->value.data;
-                for (uint i=0; i<data->value.arrayLength; i++) {
-                  data_sdp[i] = (uint32_t)dptr[i];
-                }
-            } break;
-            case UA_TYPES_INT32: {
-                int32_t *dptr = (int32_t *)data->value.data;
-                for (uint i=0; i<data->value.arrayLength; i++) {
-                    data_sdp[i] = (uint32_t)dptr[i];
-                }
-            } break;
-            case UA_TYPES_UINT32: {
-                uint32_t *dptr = (uint32_t *)data->value.data;
-                for (uint i=0; i<data->value.arrayLength; i++) {
-                    data_sdp[i] = (uint32_t)dptr[i];
-                }
-            } break;
-            case UA_TYPES_INT64: {  // TODO: 64b -> 32b, not used yet but should give an error
-                int64_t *dptr = (int64_t *)data->value.data;
-                for (uint i=0; i<data->value.arrayLength; i++) {
-                    data_sdp[i] = (uint64_t)dptr[i];
-                }
-            } break;
-            case UA_TYPES_UINT64: {  // TODO: 64b -> 32b, not used yet but should give an error
-                uint64_t *dptr = (uint64_t *)data->value.data;
-                for (uint i=0; i<data->value.arrayLength; i++) {
-                    data_sdp[i] = (uint64_t)dptr[i];
-                }
-            } break;
-            case UA_TYPES_BOOLEAN: {
-                bool *dptr = (bool *)data->value.data;
-                for (unsigned int i=0; i<data->value.arrayLength; i++) {
-                  data_sdp[i] = (uint32_t)dptr[i];
-                }
-            } break;
-            default: {
-                cout << "UA_TYPES_?: not implemented yet" << endl;
+        else {
+            try {
+                sz = data->value.arrayLength * UA_TYPES[type].memSize;
+                data_sdp = new char[sz];
+                memcpy((void *)data_sdp, (void *)data->value.data, sz);
+                retval = true;
+            } catch (runtime_error& e) {
+                cerr << "ua_write_DataSource error: " << e.what() << endl;
                 retval = false;
-            } break;
+            }
         }
 
         if (retval) {
@@ -410,12 +236,16 @@ static UA_StatusCode ua_write_DataSource(UA_Server *server,
                     // UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,"ua_write_DataSource: for fpga class");
                     SD.unb->write(termout, regname, data_sdp, data->value.arrayLength);
                 }
+                delete[] data_sdp;
             } catch (runtime_error& e) {
                 cerr << "ua_write_DataSource error: " << e.what() << endl;
                 retval = false;
             }
         }
-        delete[] data_sdp;
+        else {
+            cerr << "ua_write no retval" << endl;
+            delete[] data_sdp;
+        }
     }
 
     delete[] regname;
@@ -1076,6 +906,11 @@ int ua_server_init(bool warm_start)
             ua_add_Variable(mUaServer, m, format, size, perm);
         }
     }
+    cout << "sizeof bool=" << UA_TYPES[UA_TYPES_BOOLEAN].memSize << endl;
+    cout << "sizeof int16=" << UA_TYPES[UA_TYPES_INT16].memSize << endl;
+    cout << "sizeof int32=" << UA_TYPES[UA_TYPES_INT32].memSize << endl;
+    cout << "sizeof float=" << UA_TYPES[UA_TYPES_FLOAT].memSize << endl;
+    cout << "sizeof double=" << UA_TYPES[UA_TYPES_DOUBLE].memSize << endl;
     return 0;
 }
 
diff --git a/src/periph/fpga.cpp b/src/periph/fpga.cpp
index 5c3a1c2c483d4d02b682ae37a882f5bab512d3d0..8fe5c127074b879e48c78c79005b9cd220e2288b 100644
--- a/src/periph/fpga.cpp
+++ b/src/periph/fpga.cpp
@@ -332,9 +332,13 @@ bool Periph_fpga::write(TermOutput& termout, const string addr, const string typ
         return false;
     }
 
-    uint32_t *data_ptr = (uint32_t *)data;
+    termout.nof_vals = nvalues;
+    termout.datatype = format;
+
+    // uint32_t *data_ptr = (uint32_t *)data;
 
     if (type == "mm") {
+        uint32_t *data_ptr = (uint32_t *)data;
         retval = Write(addr, data_ptr, true);
     }
     else { // "fpga/..."
@@ -345,6 +349,7 @@ bool Periph_fpga::write(TermOutput& termout, const string addr, const string typ
     //        retval = true;
     //    } else
         if (addr == "fpga/flash_init") {
+            uint32_t *data_ptr = (uint32_t *)data;
             Flash_select = data_ptr[0];
             if (Flash_select == 0) { // factory
                 Flash_page_start = Flash_fact_sector_start * Flash_pages_per_sector;
@@ -357,29 +362,30 @@ bool Periph_fpga::write(TermOutput& termout, const string addr, const string typ
             flash_erase();
         }
         else if (addr == "fpga/flash_pages") {
-            retval = flash_pages(data_ptr, nvalues);
+            retval = flash_pages(data, nvalues);
         }
         else if (addr == "fpga/flash_page") {
-            retval = flash_page(data_ptr);
+            retval = flash_page(data);
         }
         else if (addr == "fpga/flash_prot") {
-            retval = flash_prot(data_ptr);
+            retval = flash_prot(data);
         }
         else if (addr == "fpga/epcs_mmdp_data") {
             // write to FIFO
+            uint32_t *data_ptr = (uint32_t *)data;
             retval = Write("mm/0/REG_MMDP_DATA/0/data", data_ptr, true);
         }
         else if (addr == "fpga/scrap") {
-            retval = write_fpga_scrap(data_ptr);
+            retval = write_fpga_scrap(data);
         }
         else if (addr == "fpga/weights") {
-            retval = write_fpga_weights(data_ptr);
+            retval = write_fpga_weights(data);
         }
         else if (addr == "fpga/sst_offload_weighted_subbands") {
-            retval = write_sst_offload_weighted_subbands(data_ptr);
+            retval = write_sst_offload_weighted_subbands(data);
         }
         else if (addr == "fpga/sst_offload_enable") {
-            retval = write_sst_offload_enable(data_ptr);
+            retval = write_sst_offload_enable(data);
         }
         else if (addr == "fpga/sst_offload_hdr_eth_destination_mac") {
             retval = write_sst_offload_hdr_eth_destination_mac(data);
@@ -388,10 +394,10 @@ bool Periph_fpga::write(TermOutput& termout, const string addr, const string typ
             retval = write_sst_offload_hdr_ip_destination_address(data);
         }
         else if (addr == "fpga/sst_offload_hdr_udp_destination_port") {
-            retval = write_sst_offload_hdr_udp_destination_port(data_ptr);
+            retval = write_sst_offload_hdr_udp_destination_port(data);
         }
         else if (addr == "fpga/bst_offload_enable") {
-            retval = write_bst_offload_enable(data_ptr);
+            retval = write_bst_offload_enable(data);
         }
         else if (addr == "fpga/bst_offload_hdr_eth_destination_mac") {
             retval = write_bst_offload_hdr_eth_destination_mac(data);
@@ -400,13 +406,13 @@ bool Periph_fpga::write(TermOutput& termout, const string addr, const string typ
             retval = write_bst_offload_hdr_ip_destination_address(data);
         }
         else if (addr == "fpga/bst_offload_hdr_udp_destination_port") {
-            retval = write_bst_offload_hdr_udp_destination_port(data_ptr);
+            retval = write_bst_offload_hdr_udp_destination_port(data);
         }
         else if (addr == "fpga/bst_offload_nof_beamlets_per_packet") {
-            retval = write_bst_offload_nof_beamlets_per_packet(data_ptr);
+            retval = write_bst_offload_nof_beamlets_per_packet(data);
         }
         else if (addr == "fpga/xst_offload_enable") {
-            retval = write_xst_offload_enable(data_ptr);
+            retval = write_xst_offload_enable(data);
         }
         else if (addr == "fpga/xst_offload_hdr_eth_destination_mac") {
             retval = write_xst_offload_hdr_eth_destination_mac(data);
@@ -415,46 +421,46 @@ bool Periph_fpga::write(TermOutput& termout, const string addr, const string typ
             retval = write_xst_offload_hdr_ip_destination_address(data);
         }
         else if (addr == "fpga/xst_offload_hdr_udp_destination_port") {
-            retval = write_xst_offload_hdr_udp_destination_port(data_ptr);
+            retval = write_xst_offload_hdr_udp_destination_port(data);
         }
         else if (addr == "fpga/xst_processing_enable") {
-            retval = write_xst_processing_enable(data_ptr);
+            retval = write_xst_processing_enable(data);
         }
         else if (addr == "fpga/xst_integration_interval") {
-            retval = write_xst_integration_interval(data_ptr);
+            retval = write_xst_integration_interval(data);
         }
         else if (addr == "fpga/xst_subband_select") {
-            retval = write_xst_subband_select(data_ptr);
+            retval = write_xst_subband_select(data);
         }
         else if (addr == "fpga/processing_enable") {
-            retval = write_processing_enable(data_ptr);
+            retval = write_processing_enable(data);
         }
         else if (addr == "fpga/sdp_info_station_id") {
-            retval = write_sdp_info_station_id(data_ptr);
+            retval = write_sdp_info_station_id(data);
         }
         else if (addr == "fpga/sdp_info_observation_id") {
-            retval = write_sdp_info_observation_id(data_ptr);
+            retval = write_sdp_info_observation_id(data);
         }
         else if (addr == "fpga/sdp_info_nyquist_sampling_zone_index") {
-            retval = write_sdp_info_nyquist_sampling_zone_index(data_ptr);
+            retval = write_sdp_info_nyquist_sampling_zone_index(data);
         }
         else if (addr == "fpga/wg_enable") {
-            retval = write_wg_enable(data_ptr);
+            retval = write_wg_enable(data);
         }
         else if (addr == "fpga/wg_amplitude") {
-            retval = write_wg_amplitude(data_ptr);
+            retval = write_wg_amplitude(data);
         }
         else if (addr == "fpga/wg_phase") {
-            retval = write_wg_phase(data_ptr);
+            retval = write_wg_phase(data);
         }
         else if (addr == "fpga/wg_frequency") {
-            retval = write_wg_frequency(data_ptr);
+            retval = write_wg_frequency(data);
         }
         else if (addr == "fpga/signal_input_samples_delay") {
-            retval = write_signal_input_samples_delay(data_ptr);
+            retval = write_signal_input_samples_delay(data);
         }
         else if (addr == "fpga/subband_weights") {
-            retval = write_subband_weights(data_ptr);
+            retval = write_subband_weights(data);
         }
         else {
             throw runtime_error("address " + addr + " not found!");
@@ -651,13 +657,14 @@ bool Periph_fpga::read_system_info(TermOutput& termout)
     return retval;
 }
 
-bool Periph_fpga::flash_prot(uint32_t *data)
+bool Periph_fpga::flash_prot(const char *data)
 {
     bool retval = false;
     uint32_t passphrase_protect = 0;
     uint32_t passphrase_unprotect = 0xBEDA221E;
+    uint32_t *_ptr = (uint32_t *)data;
 
-    if (*data == 0) { // unprotect
+    if (*_ptr == 0) { // unprotect
         retval = Write("mm/0/REG_EPCS/0/unprotect", &passphrase_unprotect);
     }
     else { // protect
@@ -666,9 +673,10 @@ bool Periph_fpga::flash_prot(uint32_t *data)
     return retval;
 }
 
-bool Periph_fpga::flash_page(uint32_t *data)
+bool Periph_fpga::flash_page(const char *data)
 {
     bool retval = false;
+    uint32_t *_ptr = (uint32_t *)data;
 
     wait_while_epcs_busy(1);
     // write address
@@ -676,7 +684,7 @@ bool Periph_fpga::flash_page(uint32_t *data)
     retval = Write("mm/0/REG_EPCS/0/addr", &addr);
 
     // write to FIFO
-    retval = Write("mm/0/REG_MMDP_DATA/0/data", data);
+    retval = Write("mm/0/REG_MMDP_DATA/0/data", _ptr);
 
     // write_write
     uint32_t d = 1;
@@ -685,7 +693,7 @@ bool Periph_fpga::flash_page(uint32_t *data)
     return retval;
 }
 
-bool Periph_fpga::flash_pages(uint32_t *data, const uint len)
+bool Periph_fpga::flash_pages(const char *data, const uint len)
 {
     bool retval = false;
     uint page_size_words = Flash_page_size_bytes / sizeof(uint32_t);
@@ -694,7 +702,7 @@ bool Periph_fpga::flash_pages(uint32_t *data, const uint len)
     cout << "Periph_fpga::flash_pages nof_pages=" << nof_pages << endl;
 
     for (uint p=0; p<nof_pages; p++) {
-        retval = flash_page(&data[(p*page_size_words)]);
+        retval = flash_page(&data[(p*Flash_page_size_bytes)]);
         Flash_page_start++;
     }
     return retval;
@@ -892,15 +900,16 @@ bool Periph_fpga::read_fpga_scrap(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_fpga_scrap(uint32_t *data)
+bool Periph_fpga::write_fpga_scrap(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     uint32_t nvalues = mmap->getSpan("mm/0/RAM_SCRAP/0/data");
     cout << "Periph_fpga::write_fpga_scrap " << nvalues << " values" << endl;
     for (uint i=0; i<nvalues; i++) {
-        cout << data[i] << " ";
+        cout << _ptr[i] << " ";
     }
     cout << endl;
-    bool retval = Write("mm/0/RAM_SCRAP/0/data", data);
+    bool retval = Write("mm/0/RAM_SCRAP/0/data", _ptr);
     return retval;
 }
 
@@ -927,8 +936,9 @@ bool Periph_fpga::read_fpga_weights(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_fpga_weights(const uint32_t *data)
+bool Periph_fpga::write_fpga_weights(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     bool retval = false;
     uint32_t nvalues_scrap = mmap->getSpan("mm/0/RAM_SCRAP/0/data");
     uint32_t nvalues = mmap->getSpan("mm/0/RAM_BF_WEIGHTS/0/data");
@@ -936,7 +946,6 @@ bool Periph_fpga::write_fpga_weights(const uint32_t *data)
 
     uint32_t *data_scrap = new uint32_t[nvalues_scrap];
 
-    const uint32_t *ptr = data;
     uint si=0;
     for (uint i=0; i<nblocks; i++) {
         for (uint j=0; j<nvalues_scrap; j++) {
@@ -945,12 +954,12 @@ bool Periph_fpga::write_fpga_weights(const uint32_t *data)
             if (si >= nvalues) {
                 break;
             }
-            ds = *ptr++;
+            ds = *_ptr++;
             si++;
             if (si >= nvalues) {
                 break;
             }
-            ds |= ((*ptr++) << 16);
+            ds |= ((*_ptr++) << 16);
             si++;
             data_scrap[j] = ds;
         }
@@ -978,11 +987,12 @@ bool Periph_fpga::read_sst_offload_weighted_subbands(TermOutput& termout, int fo
     return retval;
 }
 
-bool Periph_fpga::write_sst_offload_weighted_subbands(uint32_t *data)
+bool Periph_fpga::write_sst_offload_weighted_subbands(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     uint32_t *reg = new uint32_t[1];
     reg[0] = 0;
-    if (data[0] == 0) reg[0] = 1;
+    if (_ptr[0] == 0) reg[0] = 1;
     bool retval = Write("mm/0/REG_DP_SELECTOR/0/input_select", reg);
     delete[] reg;
     return retval;
@@ -1005,9 +1015,11 @@ bool Periph_fpga::read_sst_offload_enable(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_sst_offload_enable(uint32_t *data)
+bool Periph_fpga::write_sst_offload_enable(const char *data)
 {
-    return Write("mm/0/REG_STAT_ENABLE_SST/0/enable", data);
+    uint32_t _data[1];
+    _data[0] = (uint32_t)data[0];
+    return Write("mm/0/REG_STAT_ENABLE_SST/0/enable", _data);
 }
 
 
@@ -1123,9 +1135,10 @@ bool Periph_fpga::read_sst_offload_hdr_udp_destination_port(TermOutput& termout,
     return retval;
 }
 
-bool Periph_fpga::write_sst_offload_hdr_udp_destination_port(uint32_t *data)
+bool Periph_fpga::write_sst_offload_hdr_udp_destination_port(const char *data)
 {
-    return Write("mm/0/REG_STAT_HDR_DAT_SST/0/udp_destination_port", data);
+    uint32_t *_ptr = (uint32_t *)data;
+    return Write("mm/0/REG_STAT_HDR_DAT_SST/0/udp_destination_port", _ptr);
 }
 
 bool Periph_fpga::read_bst_offload_enable(TermOutput& termout, int format)
@@ -1149,13 +1162,16 @@ bool Periph_fpga::read_bst_offload_enable(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_bst_offload_enable(uint32_t *data)
+bool Periph_fpga::write_bst_offload_enable(const char *data)
 {
+    bool *_ptr = (bool *)data;
     bool retval = true;
     string regname;
+    uint32_t _data[1];
     for (uint32_t i=0; i<C_N_beamsets; i++) {
         regname = "mm/" + to_string(i) + "/REG_STAT_ENABLE_BST/0/enable";
-        retval &= Write(regname, &data[i]);
+        _data[0] = (uint32_t)_ptr[i];
+        retval &= Write(regname, _data);
     }
     return retval;
 }
@@ -1313,13 +1329,14 @@ bool Periph_fpga::read_bst_offload_hdr_udp_destination_port(TermOutput& termout,
     return retval;
 }
 
-bool Periph_fpga::write_bst_offload_hdr_udp_destination_port(uint32_t *data)
+bool Periph_fpga::write_bst_offload_hdr_udp_destination_port(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     bool retval = true;
     string regname;
     for (uint32_t i=0; i<C_N_beamsets; i++) {
         regname = "mm/" + to_string(i) + "/REG_STAT_HDR_DAT_BST/0/udp_destination_port";
-        retval &= Write(regname, &data[i]);
+        retval &= Write(regname, &_ptr[i]);
     }
     return retval;
 }
@@ -1344,13 +1361,14 @@ bool Periph_fpga::read_bst_offload_nof_beamlets_per_packet(TermOutput& termout,
     return retval;
 }
 
-bool Periph_fpga::write_bst_offload_nof_beamlets_per_packet(uint32_t *data)
+bool Periph_fpga::write_bst_offload_nof_beamlets_per_packet(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     bool retval = true;
     string regname;
     for (uint32_t i=0; i<C_N_beamsets; i++) {
         regname = "mm/" + to_string(i) + "/REG_STAT_HDR_DAT_BST/0/TODO";
-        if (Write(regname, &data[i]) == false) {
+        if (Write(regname, &_ptr[i]) == false) {
             retval = false;
         }
     }
@@ -1374,9 +1392,11 @@ bool Periph_fpga::read_xst_offload_enable(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_xst_offload_enable(uint32_t *data)
+bool Periph_fpga::write_xst_offload_enable(const char *data)
 {
-    return Write("mm/0/REG_STAT_ENABLE_XST/0/enable", data);
+    uint32_t _data[1];
+    _data[0] = (bool)data[0];
+    return Write("mm/0/REG_STAT_ENABLE_XST/0/enable", _data);
 }
 
 
@@ -1492,9 +1512,10 @@ bool Periph_fpga::read_xst_offload_hdr_udp_destination_port(TermOutput& termout,
     return retval;
 }
 
-bool Periph_fpga::write_xst_offload_hdr_udp_destination_port(uint32_t *data)
+bool Periph_fpga::write_xst_offload_hdr_udp_destination_port(const char *data)
 {
-    return Write("mm/0/REG_STAT_HDR_DAT_XST/0/udp_destination_port", data);
+    uint32_t *_ptr = (uint32_t *)data;
+    return Write("mm/0/REG_STAT_HDR_DAT_XST/0/udp_destination_port", _ptr);
 }
 
 bool Periph_fpga::read_xst_processing_enable(TermOutput& termout, int format)
@@ -1513,7 +1534,7 @@ bool Periph_fpga::read_xst_processing_enable(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_xst_processing_enable(uint32_t *data)
+bool Periph_fpga::write_xst_processing_enable(const char *data)
 {
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
@@ -1557,8 +1578,9 @@ bool Periph_fpga::read_xst_integration_interval(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_xst_integration_interval(uint32_t *data)
+bool Periph_fpga::write_xst_integration_interval(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     // TODO, fill in if supported in FW
     // return Write("mm/0/REG_STAT_HDR_DAT_XST/0/??", data);
     return true;
@@ -1583,11 +1605,12 @@ bool Periph_fpga::read_xst_subband_select(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_xst_subband_select(uint32_t *data)
+bool Periph_fpga::write_xst_subband_select(const char *data)
 {
+    uint32_t *_ptr = (uint32_t *)data;
     bool retval = true;
-    retval &= Write("mm/0/REG_CROSSLETS_INFO/0/offset", &data[1]);
-    retval &= Write("mm/0/REG_CROSSLETS_INFO/0/step", &data[0]);
+    retval &= Write("mm/0/REG_CROSSLETS_INFO/0/offset", &_ptr[1]);
+    retval &= Write("mm/0/REG_CROSSLETS_INFO/0/step", &_ptr[0]);
     return retval;
 }
 
@@ -1608,14 +1631,14 @@ bool Periph_fpga::read_processing_enable(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_processing_enable(uint32_t *data)
+bool Periph_fpga::write_processing_enable(const char *data)
 {
     // write dp_on 0
     // write bsn_init [calc val for next sec]
     // write bsn_time_offset [calc val if odd]
     // write dp_on_pps 1
     // write dp_on 1
-
+    
     uint32_t *reg = new uint32_t[2];
     reg[0] = 0;
     reg[1] = 0;
@@ -1687,8 +1710,9 @@ bool Periph_fpga::read_sdp_info_station_id(TermOutput& termout, int format) {
     return retval;
 }
 
-bool Periph_fpga::write_sdp_info_station_id(uint32_t *data) {
-    bool retval = Write("mm/0/REG_SDP_INFO/0/station_id", data);
+bool Periph_fpga::write_sdp_info_station_id(const char *data) {
+    uint32_t *_ptr = (uint32_t *)data;
+    bool retval = Write("mm/0/REG_SDP_INFO/0/station_id", _ptr);
     return retval;
 }
 
@@ -1707,8 +1731,9 @@ bool Periph_fpga::read_sdp_info_observation_id(TermOutput& termout, int format)
     return retval;
 }
 
-bool Periph_fpga::write_sdp_info_observation_id(uint32_t *data) {
-    bool retval = Write("mm/0/REG_SDP_INFO/0/observation_id", data);
+bool Periph_fpga::write_sdp_info_observation_id(const char *data) {
+    uint32_t *_ptr = (uint32_t *)data;
+    bool retval = Write("mm/0/REG_SDP_INFO/0/observation_id", _ptr);
     return retval;
 }
 
@@ -1727,8 +1752,9 @@ bool Periph_fpga::read_sdp_info_nyquist_sampling_zone_index(TermOutput& termout,
     return retval;
 }
 
-bool Periph_fpga::write_sdp_info_nyquist_sampling_zone_index(uint32_t *data) {
-    bool retval = Write("mm/0/REG_SDP_INFO/0/nyquist_zone_index", data);
+bool Periph_fpga::write_sdp_info_nyquist_sampling_zone_index(const char *data) {
+    uint32_t *_ptr = (uint32_t *)data;
+    bool retval = Write("mm/0/REG_SDP_INFO/0/nyquist_zone_index", _ptr);
     return retval;
 }
 
@@ -1830,7 +1856,8 @@ bool Periph_fpga::read_wg_enable(TermOutput& termout, int format) {
     return retval;
 }
 
-bool Periph_fpga::write_wg_enable(uint32_t *data) {
+bool Periph_fpga::write_wg_enable(const char *data) {
+    bool *_ptr = (bool *)data;
     bool retval = true;
     uint32_t *reg = new uint32_t[4];
     uint64_t scheduled_bsn;
@@ -1841,7 +1868,7 @@ bool Periph_fpga::write_wg_enable(uint32_t *data) {
 
     // turn off waveform
     for (uint i=0; i< C_S_pn; i++) {
-        wg_enable = (bool)data[i];
+        wg_enable = _ptr[i];
         if (wg_enable == false) {
             regname1 = "mm/0/REG_WG/" + to_string(i) + "/mode";
             regname2 = "mm/0/REG_WG/" + to_string(i) + "/nof_samples";
@@ -1851,7 +1878,7 @@ bool Periph_fpga::write_wg_enable(uint32_t *data) {
     }
     // turn on waveform
     for (uint i=0; i< C_S_pn; i++) {
-        wg_enable = (bool)data[i];
+        wg_enable = _ptr[i];
         if (wg_enable == true) {
             regname1 = "mm/0/REG_WG/" + to_string(i) + "/mode";
             regname2 = "mm/0/REG_WG/" + to_string(i) + "/nof_samples";
@@ -1860,7 +1887,7 @@ bool Periph_fpga::write_wg_enable(uint32_t *data) {
         }
     }
     // get bsn and add latency
-    wg_enable = (bool)data[0];
+    wg_enable = _ptr[0];
     if (wg_enable == true) {
         regname1 = "mm/0/REG_BSN_SCHEDULER/0/scheduled_bsn";
         retval = Read(regname1, reg);
@@ -1873,7 +1900,7 @@ bool Periph_fpga::write_wg_enable(uint32_t *data) {
     }
     // write sheduled bsn
     for (uint i=0; i< C_S_pn; i++) {
-        wg_enable = (bool)data[i];
+        wg_enable = _ptr[i];
         if (wg_enable == true) {
             regname1 = "mm/0/REG_BSN_SCHEDULER/" + to_string(i) + "/scheduled_bsn";
             retval = Write(regname1, reg);
@@ -1911,13 +1938,13 @@ bool Periph_fpga::read_wg_amplitude(TermOutput& termout, int format) {
     return retval;
 }
 
-bool Periph_fpga::write_wg_amplitude(uint32_t *data) {
+bool Periph_fpga::write_wg_amplitude(const char *data) {
+    double *_ptr = (double *)data;
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
 
     double ampl;
     string regname;
-    double *_ptr = (double *)data;
     for (uint i=0; i< C_S_pn; i++) {
         regname = "mm/0/REG_WG/" + to_string(i) + "/ampl";
         ampl = (*_ptr) * C_WG_AMPL_UNIT;
@@ -1958,13 +1985,13 @@ bool Periph_fpga::read_wg_phase(TermOutput& termout, int format) {
     return retval;
 }
 
-bool Periph_fpga::write_wg_phase (uint32_t *data) {
+bool Periph_fpga::write_wg_phase (const char *data) {
+    double *_ptr = (double *)data;
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
 
     float phase;
     string regname;
-    double *_ptr = (double *)data;
     for (uint i=0; i< C_S_pn; i++) {
         regname = "mm/0/REG_WG/" + to_string(i) + "/phase";
         phase = (*_ptr) * C_WG_PHASE_UNIT;
@@ -2006,13 +2033,13 @@ bool Periph_fpga::read_wg_frequency(TermOutput& termout, int format) {
     return retval;
 }
 
-bool Periph_fpga::write_wg_frequency(uint32_t *data) {
+bool Periph_fpga::write_wg_frequency(const char *data) {
+    double *_ptr = (double *)data;
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
 
     double freq, intpart;
     string regname;
-    double *_ptr = (double *)data;
     for (uint i=0; i<C_S_pn; i++) {
         regname = "mm/0/REG_WG/" + to_string(i) + "/freq";
         freq = (*_ptr) / C_F_adc;
@@ -2222,14 +2249,14 @@ bool Periph_fpga::read_jesd204b_rx_err1(TermOutput& termout, int format, int mod
     return retval;
 }
 
-bool Periph_fpga::write_signal_input_samples_delay(uint32_t *data) {
+bool Periph_fpga::write_signal_input_samples_delay(const char *data) {
+    uint32_t *_ptr = (uint32_t *)data;
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
     uint32_t min_sample_delay = 0;
     uint32_t max_sample_delay = 4095;
     uint32_t sample_delay;
     string regname;
-    uint32_t *_ptr = (uint32_t *)data;
     for (uint i=0; i< C_S_pn; i++) {
         sample_delay = *_ptr;
         if ((sample_delay < min_sample_delay) || (sample_delay > max_sample_delay)) {
@@ -2237,7 +2264,7 @@ bool Periph_fpga::write_signal_input_samples_delay(uint32_t *data) {
             retval = false;
         } else {
             regname = "mm/0/REG_DP_SHIFTRAM/" + to_string(i) + "/shift";
-            reg[0] = (uint32_t)sample_delay;
+            reg[0] = sample_delay;
             retval = Write(regname, reg);
             _ptr++;
         }
@@ -2263,7 +2290,8 @@ bool Periph_fpga::read_signal_input_samples_delay(TermOutput& termout, int forma
     return retval;
 }
 
-bool Periph_fpga::write_subband_weights(uint32_t *data) {
+bool Periph_fpga::write_subband_weights(const char *data) {
+    uint32_t *_ptr = (uint32_t *)data;
     bool retval = true;
     string regname;
     uint32_t span;
@@ -2274,7 +2302,7 @@ bool Periph_fpga::write_subband_weights(uint32_t *data) {
         regname = "mm/0/RAM_EQUALIZER_GAINS/" + to_string(i) + "/data";
         span = mmap->getSpan((regname));
         data_ptr = i * span;
-        retval = Write(regname, &data[data_ptr]);
+        retval = Write(regname, &_ptr[data_ptr]);
     }
     return retval;
 }
diff --git a/src/periph/fpga.h b/src/periph/fpga.h
index eea3a2415f2c30c97388334cdfcaaa2c35d89466..2a4fea97b5f346e9914f577509065feefbcfdb31 100644
--- a/src/periph/fpga.h
+++ b/src/periph/fpga.h
@@ -82,9 +82,9 @@ private:
 
   bool flash_erase_sector(uint32_t sector);
   bool flash_erase();
-  bool flash_pages(uint32_t *data, const uint len);
-  bool flash_page(uint32_t *data);
-  bool flash_prot(uint32_t *data);
+  bool flash_pages(const char *data, const uint len);
+  bool flash_page(const char *data);
+  bool flash_prot(const char *data);
   bool wait_while_epcs_busy(uint sleeptime);
   std::string read_design_name();
   std::string read_design_note();
@@ -97,68 +97,68 @@ private:
   bool read_fpga_temperature(TermOutput& termout, int format);
 
   bool read_fpga_scrap(TermOutput& termout, int format);
-  bool write_fpga_scrap(uint32_t *data);
+  bool write_fpga_scrap(const char *data);
 
   bool read_fpga_weights(TermOutput& termout, int format);
-  bool write_fpga_weights(const uint32_t *data);
+  bool write_fpga_weights(const char *data);
 
   bool read_sst_offload_weighted_subbands(TermOutput& termout, int format);
-  bool write_sst_offload_weighted_subbands(uint32_t *data);
+  bool write_sst_offload_weighted_subbands(const char *data);
   bool read_sst_offload_enable(TermOutput& termout, int format);
-  bool write_sst_offload_enable(uint32_t *data);
+  bool write_sst_offload_enable(const char *data);
   bool read_sst_offload_hdr_eth_destination_mac(TermOutput& termout, int format);
   bool write_sst_offload_hdr_eth_destination_mac(const char *data);
   bool read_sst_offload_hdr_ip_destination_address(TermOutput& termout, int format);
   bool write_sst_offload_hdr_ip_destination_address(const char *data);
   bool read_sst_offload_hdr_udp_destination_port(TermOutput& termout, int format);
-  bool write_sst_offload_hdr_udp_destination_port(uint32_t *data);
+  bool write_sst_offload_hdr_udp_destination_port(const char *data);
 
   bool read_bst_offload_enable(TermOutput& termout, int format);
-  bool write_bst_offload_enable(uint32_t *data);
+  bool write_bst_offload_enable(const char *data);
   bool read_bst_offload_hdr_eth_destination_mac(TermOutput& termout, int format);
   bool write_bst_offload_hdr_eth_destination_mac(const char *data);
   bool read_bst_offload_hdr_ip_destination_address(TermOutput& termout, int format);
   bool write_bst_offload_hdr_ip_destination_address(const char *data);
   bool read_bst_offload_hdr_udp_destination_port(TermOutput& termout, int format);
-  bool write_bst_offload_hdr_udp_destination_port(uint32_t *data);
+  bool write_bst_offload_hdr_udp_destination_port(const char *data);
   bool read_bst_offload_nof_beamlets_per_packet(TermOutput& termout, int format);
-  bool write_bst_offload_nof_beamlets_per_packet(uint32_t *data);
+  bool write_bst_offload_nof_beamlets_per_packet(const char *data);
 
   bool read_xst_subband_select(TermOutput& termout, int format);
-  bool write_xst_subband_select(uint32_t *data);
+  bool write_xst_subband_select(const char *data);
   bool read_xst_integration_interval(TermOutput& termout, int format);
-  bool write_xst_integration_interval(uint32_t *data);
+  bool write_xst_integration_interval(const char *data);
   bool read_xst_processing_enable(TermOutput& termout, int format);
-  bool write_xst_processing_enable(uint32_t *data);
+  bool write_xst_processing_enable(const char *data);
   bool read_xst_offload_enable(TermOutput& termout, int format);
-  bool write_xst_offload_enable(uint32_t *data);
+  bool write_xst_offload_enable(const char *data);
   bool read_xst_offload_hdr_eth_destination_mac(TermOutput& termout, int format);
   bool write_xst_offload_hdr_eth_destination_mac(const char *data);
   bool read_xst_offload_hdr_ip_destination_address(TermOutput& termout, int format);
   bool write_xst_offload_hdr_ip_destination_address(const char *data);
   bool read_xst_offload_hdr_udp_destination_port(TermOutput& termout, int format);
-  bool write_xst_offload_hdr_udp_destination_port(uint32_t *data);
+  bool write_xst_offload_hdr_udp_destination_port(const char *data);
 
   bool read_processing_enable(TermOutput& termout, int format);
-  bool write_processing_enable(uint32_t *data);
+  bool write_processing_enable(const char *data);
 
   bool read_sdp_info_station_id(TermOutput& termout, int format);
-  bool write_sdp_info_station_id(uint32_t *data);
+  bool write_sdp_info_station_id(const char *data);
   bool read_sdp_info_observation_id(TermOutput& termout, int format);
-  bool write_sdp_info_observation_id(uint32_t *data);
+  bool write_sdp_info_observation_id(const char *data);
   bool read_sdp_info_nyquist_sampling_zone_index(TermOutput& termout, int format);
-  bool write_sdp_info_nyquist_sampling_zone_index(uint32_t *data);
+  bool write_sdp_info_nyquist_sampling_zone_index(const char *data);
   bool read_sdp_info_antenna_band_index(TermOutput& termout, int format);
   bool read_sdp_info_f_adc(TermOutput& termout, int format);
   bool read_sdp_info_fsub_type(TermOutput& termout, int format);
   bool read_wg_enable(TermOutput& termout, int format);
 
-  bool write_wg_enable(uint32_t *data);
+  bool write_wg_enable(const char *data);
   bool read_wg_amplitude(TermOutput& termout, int format);
-  bool write_wg_amplitude(uint32_t *data);
+  bool write_wg_amplitude(const char *data);
   bool read_wg_phase(TermOutput& termout, int format);
-  bool write_wg_phase (uint32_t *data);
-  bool write_wg_frequency(uint32_t *data);
+  bool write_wg_phase (const char *data);
+  bool write_wg_frequency(const char *data);
   bool read_wg_frequency(TermOutput& termout, int format);
 
   bool read_bsn_monitor_input_sync_timeout(TermOutput& termout, int format, int mode);
@@ -172,10 +172,10 @@ private:
   bool read_jesd204b_rx_err0(TermOutput& termout, int format, int mode);
   bool read_jesd204b_rx_err1(TermOutput& termout, int format, int mode);
   
-  bool write_signal_input_samples_delay(uint32_t *data);
+  bool write_signal_input_samples_delay(const char *data);
   bool read_signal_input_samples_delay(TermOutput& termout, int format);
 
-  bool write_subband_weights(uint32_t *data);
+  bool write_subband_weights(const char *data);
   bool read_subband_weights(TermOutput& termout, int format);
 
   bool read_sdp_info_block_period(TermOutput& termout, int format);
diff --git a/src/tr.cpp b/src/tr.cpp
index f63ce90be75573e2d748e63547d180a69ca6cbd6..b5319cf3064e8b3351a6eb183e4e43a2d169156a 100644
--- a/src/tr.cpp
+++ b/src/tr.cpp
@@ -52,9 +52,9 @@ TranslatorMap::TranslatorMap()
     translatorMap->add_register("TR_fpga_mask_R",                "-", C_N_pn, 1, "RO", REG_FORMAT_BOOLEAN);
     translatorMap->add_register("TR_fpga_mask_RW",               "-", C_N_pn, 1, "RW", REG_FORMAT_BOOLEAN);
     translatorMap->add_register("TR_software_version_R",         "-", 1,      1, "RO", REG_FORMAT_STRING);
-    translatorMap->add_register("TR_start_time_R",               "-", 1,      1, "RO", REG_FORMAT_UINT32);
+    translatorMap->add_register("TR_start_time_R",               "-", 1,      1, "RO", REG_FORMAT_INT64);
     // translatorMap->add_register("TR_tod_client_status_R",        "-", 1,      1, "RO", REG_FORMAT_BOOLEAN);  // TODO: PTP client is part of linux, can I get a status?
-    translatorMap->add_register("TR_tod_R",                      "-", 1,      1, "RO", REG_FORMAT_UINT32);
+    translatorMap->add_register("TR_tod_R",                      "-", 1,      1, "RO", REG_FORMAT_INT64);
     translatorMap->add_register("TR_tod_pps_delta_R",            "-", 1,      1, "RO", REG_FORMAT_DOUBLE);
     translatorMap->add_register("TR_fpga_communication_error_R", "-", C_N_pn, 1, "RO", REG_FORMAT_BOOLEAN);
     // translatorMap->add_register("TR_reload_RW",                  "-", 1,      1, "RW", REG_FORMAT_BOOLEAN);  // Maybe for future.
@@ -68,7 +68,7 @@ TranslatorMap::~TranslatorMap()
 }
 
 bool TranslatorMap::translator(TermOutput& termout, const char cmd, const string addr,
-                               const unsigned int *data, const int nvalues)
+                               const char *data, const int nvalues)
 {
     bool retval = false;
     termout.clear();
@@ -173,7 +173,7 @@ bool TranslatorMap::read(TermOutput& termout,
 }
 
 bool TranslatorMap::write(TermOutput& termout,
-                          const string addr, const unsigned int *data,
+                          const string addr, const char *data,
                           const int nvalues)
 {
     return translator(termout, 'W', addr, data, nvalues);
diff --git a/src/tr.h b/src/tr.h
index 66826ee98c644db55ab7c8c2fcaac300f72ea486..b9047a07767f0dc2fa0f886d5f41c4832da81443 100644
--- a/src/tr.h
+++ b/src/tr.h
@@ -54,10 +54,10 @@ public:
     };
 
     bool translator(TermOutput& termout, const char cmd, const std::string addr,
-                    const unsigned int *data, const int len);
+                    const char *data, const int len);
 
     bool write(TermOutput& termout, const std::string addr,
-               const unsigned int *data, const int nvalues);
+               const char *data, const int nvalues);
 
     bool read(TermOutput& termout, const std::string addr, const int nvalues);
 };