diff --git a/src/constants.h b/src/constants.h
index 0e883ad7830c60c58a032c48f720f5aba2b66a2f..1ab897de269ba69b276b4447e1e4ad790dbc1ac9 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -41,4 +41,4 @@
 
 #define C_BSN_LATENCY 20000  // 1 period = 5.12us, 20000 = +/- 100ms
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/fpga.cpp b/src/fpga.cpp
index 16403202ecbcde1dd4abe06c111b2675c1b06841..0c85e8c3e72f87a37d99be026765cab323f4e37d 100644
--- a/src/fpga.cpp
+++ b/src/fpga.cpp
@@ -57,7 +57,7 @@ Fpga::Fpga(list<class Node*>& nodelist)
     pointMap->add_register("FPGA_mask_R",                                    "fpga/enable_mask",                            nodes.size(), 1, "RO", REG_FORMAT_BOOLEAN, 1);
     pointMap->add_register("FPGA_mask_RW",                                   "fpga/enable_mask",                            nodes.size(), 1, "RW", REG_FORMAT_BOOLEAN, 1);
     pointMap->add_register("FPGA_status_R",                                  "fpga/status",                                 nodes.size(), 1, "RO", REG_FORMAT_BOOLEAN, 1);
-    pointMap->add_register("FPGA_temp_R",                                    "fpga/temp",                                   nodes.size(), 1, "RO", REG_FORMAT_FLOAT,   1);
+    pointMap->add_register("FPGA_temp_R",                                    "fpga/temp",                                   nodes.size(), 1, "RO", REG_FORMAT_DOUBLE,  1);
     pointMap->add_register("FPGA_version_R",                                 "fpga/name",                                   nodes.size(), 1, "RO", REG_FORMAT_STRING,  1);
     pointMap->add_register("FPGA_firmware_version_R",                        "fpga/firmware_version",                       nodes.size(), 1, "RO", REG_FORMAT_STRING,  1);
     pointMap->add_register("FPGA_hardware_version_R",                        "fpga/hardware_version",                       nodes.size(), 1, "RO", REG_FORMAT_STRING,  1);
@@ -84,14 +84,14 @@ Fpga::Fpga(list<class Node*>& nodelist)
     pointMap->add_register("FPGA_sdp_info_fsub_type_R",                      "fpga/sdp_info_fsub_type",                     nodes.size(), 1, "RO", REG_FORMAT_UINT32,  1);
     pointMap->add_register("FPGA_sdp_info_block_period_R",                   "fpga/sdp_info_block_period",                  nodes.size(), 1, "RO", REG_FORMAT_UINT32,  1);
 
-    pointMap->add_register("FPGA_wg_enable_R",                               "fpga/wg_enable",                              nodes.size(), C_S_pn, "RO", REG_FORMAT_BOOLEAN,  1);
-    pointMap->add_register("FPGA_wg_enable_RW",                              "fpga/wg_enable",                              nodes.size(), C_S_pn, "RW", REG_FORMAT_BOOLEAN,  1);
-    pointMap->add_register("FPGA_wg_amplitude_R",                            "fpga/wg_amplitude",                           nodes.size(), C_S_pn, "RO", REG_FORMAT_FLOAT,  1);
-    pointMap->add_register("FPGA_wg_amplitude_RW",                           "fpga/wg_amplitude",                           nodes.size(), C_S_pn, "RW", REG_FORMAT_FLOAT,  1);
-    pointMap->add_register("FPGA_wg_phase_R",                                "fpga/wg_phase",                               nodes.size(), C_S_pn, "RO", REG_FORMAT_FLOAT,  1);
-    pointMap->add_register("FPGA_wg_phase_RW",                               "fpga/wg_phase",                               nodes.size(), C_S_pn, "RW", REG_FORMAT_FLOAT,  1);
-    pointMap->add_register("FPGA_wg_frequency_R",                            "fpga/wg_frequency",                           nodes.size(), C_S_pn, "RO", REG_FORMAT_FLOAT,  1);
-    pointMap->add_register("FPGA_wg_frequency_RW",                           "fpga/wg_frequency",                           nodes.size(), C_S_pn, "RW", REG_FORMAT_FLOAT,  1);
+    pointMap->add_register("FPGA_wg_enable_R",                               "fpga/wg_enable",                              nodes.size(), C_S_pn, "RO", REG_FORMAT_BOOLEAN, 1);
+    pointMap->add_register("FPGA_wg_enable_RW",                              "fpga/wg_enable",                              nodes.size(), C_S_pn, "RW", REG_FORMAT_BOOLEAN, 1);
+    pointMap->add_register("FPGA_wg_amplitude_R",                            "fpga/wg_amplitude",                           nodes.size(), C_S_pn, "RO", REG_FORMAT_DOUBLE,  1);
+    pointMap->add_register("FPGA_wg_amplitude_RW",                           "fpga/wg_amplitude",                           nodes.size(), C_S_pn, "RW", REG_FORMAT_DOUBLE,  1);
+    pointMap->add_register("FPGA_wg_phase_R",                                "fpga/wg_phase",                               nodes.size(), C_S_pn, "RO", REG_FORMAT_DOUBLE,  1);
+    pointMap->add_register("FPGA_wg_phase_RW",                               "fpga/wg_phase",                               nodes.size(), C_S_pn, "RW", REG_FORMAT_DOUBLE,  1);
+    pointMap->add_register("FPGA_wg_frequency_R",                            "fpga/wg_frequency",                           nodes.size(), C_S_pn, "RO", REG_FORMAT_DOUBLE,  1);
+    pointMap->add_register("FPGA_wg_frequency_RW",                           "fpga/wg_frequency",                           nodes.size(), C_S_pn, "RW", REG_FORMAT_DOUBLE,  1);
 
     uint32_t scrap_span = 0;
     uint32_t scrap_span_next = 0;
@@ -214,14 +214,9 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
         auto node = select_node(nodes[idx]);
         // if (node->getEnabled() == false) { continue; }
 
-        // uint node_nr = node_number(node);
-
         CPointMap *regmap = node->get_RegisterMap();
         int span = regmap->getDataSize(relative_addr);
         
-        // CMMap *mmap = node->get_MMap();
-        // int span = mmap->getSpan(addr);
-
         int nof_values = nvalues;
         if (nvalues < 0 || nvalues > span) {
             nof_values = span;
@@ -236,9 +231,6 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
                 cout << "str=" << cm.getStr(idx) << " len=" << cm.getStrLen(idx) << endl;
                 memcpy((void *)data2, (void *)cm.getStrPtr(idx), cm.getStrLen(idx));
                 nof_values = cm.getStrLen(idx);
-                // if (cm.getStrLen(idx) % 4 > 0) {
-                //     nof_values += 1;
-                // }
                 if ((ret = node->exec_cmd(cmd, relative_addr, type, instance,
                                           data2, nof_values, format))) {
                     retcnt++;
@@ -325,6 +317,13 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
                         ptr_out[idx * termresults.nof_vals + i] = ptr_in[i];
                     }
                 } break;
+                case REG_FORMAT_DOUBLE: {
+                    double *ptr_in = (double *)termresults.val;
+                    double *ptr_out = (double *)termout.val;
+                    for (unsigned int i=0; i<termresults.nof_vals; i++) {
+                        ptr_out[idx * termresults.nof_vals + i] = ptr_in[i];
+                    }
+                } break;
                 case REG_FORMAT_STRING: {
                     char *ptr_in = (char *)termresults.val;
                     char *ptr_out = (char *)termout.val;
diff --git a/src/node.cpp b/src/node.cpp
index fe7e36f503223e0ef19ecec8c3d87ddc9f318f76..fdea5dacfee5ed01615c5ea120c707ecd4b99cdf 100644
--- a/src/node.cpp
+++ b/src/node.cpp
@@ -147,6 +147,9 @@ void Node::worker()
             case REG_FORMAT_FLOAT: {
                 sz = sizeof(float);
             } break;
+            case REG_FORMAT_DOUBLE: {
+                sz = sizeof(double);
+            } break;
             case REG_FORMAT_INT32: {
                 sz = sizeof(int32_t);
             } break;
@@ -320,6 +323,9 @@ bool Node::exec_reply(TermOutput& termout)
     int sz = 0;
 
     switch (r->datatype) {
+         case REG_FORMAT_DOUBLE: {
+            sz = sizeof(double);
+        } break;
         case REG_FORMAT_FLOAT: {
             sz = sizeof(float);
         } break;
diff --git a/src/opcua/ua_server.cpp b/src/opcua/ua_server.cpp
index 583932ef6a3217a37fe0ba7933180e676950d55d..3172096b18483420eaafa52534ca559d1cf296d7 100644
--- a/src/opcua/ua_server.cpp
+++ b/src/opcua/ua_server.cpp
@@ -139,6 +139,12 @@ static UA_StatusCode ua_read_DataSource(UA_Server *server,
                 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];
@@ -202,6 +208,16 @@ static UA_StatusCode ua_read_DataSource(UA_Server *server,
                 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;
@@ -297,6 +313,9 @@ static UA_StatusCode ua_write_DataSource(UA_Server *server,
                 case UA_TYPES_FLOAT: {
                     retval = false;
                 } break;
+                case UA_TYPES_DOUBLE: {
+                    retval = false;
+                } break;
                 case UA_TYPES_INT16: {
                     retval = true;
                     int16_t *dptr = (int16_t *)data->value.data;
@@ -357,34 +376,29 @@ static UA_StatusCode ua_write_DataSource(UA_Server *server,
 
         if (data->hasValue && data->value.arrayLength > 0) {
             //data.value is a UA_Variant
-            // cout << "data.value.arrayLength=" << data->value.arrayLength << endl;
-
-            // unsigned int *data_sdp = new unsigned int[data->value.arrayLength];
-            uint32_t *data_sdp = new uint32_t[data->value.arrayLength];
+            uint32_t *data_sdp = new uint32_t[data->value.arrayLength*2];
             CMData cm(data->value.arrayLength);
             cm.clear();
 
             switch (ntype.identifier.numeric - 1) {
                 case UA_TYPES_STRING: {
                     cm.setFormat(FORMAT_STRING);
-                    // cout << "dataformat=" << cm.getFormat() << endl;
                     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];
-                        // cout << "n_chars=" << to_string(str_data.length) << endl;
                         cm.clearStr(i);
                         memcpy((void *)cm.getStrPtr(i), (void *)str_data.data, str_data.length);
-                        cout << dec << i << " [" << cm.getStr(i) << "] " << endl;
                     }
                     retval = true;
                 } break;
                 case UA_TYPES_FLOAT: {
                     retval = true;
-                    float *dptr = (float *)data->value.data;
-                    for (uint i=0; i<data->value.arrayLength; i++) {
-                      data_sdp[i] = (uint32_t)dptr[i];
-                    }
+                    memcpy(data_sdp, data->value.data, data->value.arrayLength*sizeof(UA_Float));
+                } break;
+                case UA_TYPES_DOUBLE: {
+                    retval = true;
+                    memcpy(data_sdp, data->value.data, data->value.arrayLength*sizeof(UA_Double));
                 } break;
                 case UA_TYPES_INT16: {
                     retval = true;
@@ -782,6 +796,62 @@ static void ua_add_Variable_float(UA_Server *server, string regname, unsigned in
     }
 }
 
+static void ua_add_Variable_double(UA_Server *server, string regname, unsigned int size, string perm, bool is_scalar)
+{
+    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "ua_add_Variable_double: %s", (char *)regname.c_str());
+    UA_VariableAttributes vattr = UA_VariableAttributes_default;
+
+    if (perm == "RW") {
+        vattr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
+    }
+    else if (perm == "WO") {
+        vattr.accessLevel = UA_ACCESSLEVELMASK_WRITE;
+    }
+    else if (perm == "RO") {
+        vattr.accessLevel = UA_ACCESSLEVELMASK_READ;
+    }
+
+    if (is_scalar) {
+        UA_Double value = UA_Double(0.0);
+        UA_Variant_setScalar(&vattr.value, &value, &UA_TYPES[UA_TYPES_DOUBLE]);
+        vattr.valueRank = UA_VALUERANK_SCALAR;
+    }
+    else {
+        vattr.valueRank = UA_VALUERANK_ONE_DIMENSION;
+
+        UA_UInt32 myArrayDimensions[1] = {size};
+        vattr.arrayDimensions = myArrayDimensions;
+        vattr.arrayDimensionsSize = 1;
+
+        UA_Double *values = (UA_Double *) UA_Array_new(size, &UA_TYPES[UA_TYPES_DOUBLE]);
+        for (unsigned int i=0; i<size; i++) {
+            values[i] = UA_Double(0.0);
+        }
+        UA_Variant_setArray(&vattr.value, values, size, &UA_TYPES[UA_TYPES_DOUBLE]);
+
+        vattr.value.arrayDimensions = myArrayDimensions;
+        vattr.value.arrayDimensionsSize = 1;
+    }
+
+    vattr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
+    vattr.displayName = UA_LOCALIZEDTEXT((char *)"locale", (char *)regname.c_str());
+    UA_DataSource DataSource;
+    DataSource.read = ua_read_DataSource;
+    DataSource.write = ua_write_DataSource;
+
+    UA_StatusCode retval = UA_Server_addDataSourceVariableNode(server,
+                                       UA_NODEID_STRING(mUaLofarNameSpace, (char *)regname.c_str()), // currentNodeId
+                                       UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), // parentNodeId
+                                       UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), // parentReferenceNodeId
+                                       UA_QUALIFIEDNAME(mUaLofarNameSpace, (char *)regname.c_str()), // node browse name
+                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
+                                       vattr, DataSource, NULL, NULL);
+    if (retval != UA_STATUSCODE_GOOD) {
+        // handle error
+        cout << "Error adding node" << endl;
+    }
+}
+
 static void ua_add_Variable_boolean(UA_Server *server, string regname, unsigned int size, string perm, bool is_scalar)
 {
     UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "ua_add_Variable_boolean: %s", (char *)regname.c_str());
@@ -861,6 +931,9 @@ static void ua_add_Variable(UA_Server *server, string regname, int format, unsig
         case REG_FORMAT_FLOAT: {
             ua_add_Variable_float(server, regname, size, perm, is_scalar);
         } break;
+        case REG_FORMAT_DOUBLE: {
+            ua_add_Variable_double(server, regname, size, perm, is_scalar);
+        } break;
         case REG_FORMAT_BOOLEAN: {
             ua_add_Variable_boolean(server, regname, size, perm, is_scalar);
         } break;
diff --git a/src/periph/fpga.cpp b/src/periph/fpga.cpp
index a2e48f3ad82d5415f8b97cdb2dfd5a78c3d7af35..469d3d178d957568d938f1e302b7bb8e5053420f 100644
--- a/src/periph/fpga.cpp
+++ b/src/periph/fpga.cpp
@@ -89,7 +89,7 @@ Periph_fpga::Periph_fpga(string ipaddr, string expected_design_name, uint expect
     registerMap->add_register("fpga/note",                                   "-", 0, 1, "RO", REG_FORMAT_STRING,  1);
     registerMap->add_register("fpga/firmware_version",                       "-", 0, 1, "RO", REG_FORMAT_STRING,  10);
     registerMap->add_register("fpga/hardware_version",                       "-", 0, 1, "RO", REG_FORMAT_STRING,  10);
-    registerMap->add_register("fpga/temp",                                   "-", 1, 1, "RO", REG_FORMAT_STRING,  5);
+    registerMap->add_register("fpga/temp",                                   "-", 1, 1, "RO", REG_FORMAT_DOUBLE,  5);
     registerMap->add_register("fpga/status",                                 "-", 1, 1, "RO", REG_FORMAT_STRING,  1);
     registerMap->add_register("fpga/enable_mask",                            "-", 1, 1, "RW", REG_FORMAT_BOOLEAN, 1);
     registerMap->add_register("fpga/rbf",                                    "-", 0, 1, "RW", REG_FORMAT_STRING,  1);
@@ -123,9 +123,9 @@ Periph_fpga::Periph_fpga(string ipaddr, string expected_design_name, uint expect
     registerMap->add_register("fpga/sdp_info_block_period",                  "-", 1, 1, "RO", REG_FORMAT_UINT32, 1);
 
     registerMap->add_register("fpga/wg_enable",                              "-", 1, 12, "RW", REG_FORMAT_BOOLEAN, 1);
-    registerMap->add_register("fpga/wg_amplitude",                           "-", 1, 12, "RW", REG_FORMAT_FLOAT, 1);
-    registerMap->add_register("fpga/wg_phase",                               "-", 1, 12, "RW", REG_FORMAT_FLOAT, 1);
-    registerMap->add_register("fpga/wg_frequency",                           "-", 1, 12, "RW", REG_FORMAT_FLOAT, 1);
+    registerMap->add_register("fpga/wg_amplitude",                           "-", 1, 12, "RW", REG_FORMAT_DOUBLE, 1);
+    registerMap->add_register("fpga/wg_phase",                               "-", 1, 12, "RW", REG_FORMAT_DOUBLE, 1);
+    registerMap->add_register("fpga/wg_frequency",                           "-", 1, 12, "RW", REG_FORMAT_DOUBLE, 1);
 
     registerMap->print_screen();
 
@@ -214,7 +214,7 @@ bool Periph_fpga::Write(const string addr_str, const uint32_t nvalues, uint32_t
     }
     uint32_t addr = mmap->getValidAddr((addr_str), 1);
     uint32_t span = mmap->getSpan((addr_str));
-    cout << "addr=" << addr_str << " span=" << to_string(span) << endl;
+    //cout << "addr=" << addr_str << " span=" << to_string(span) << endl;
     mmap->getWritePermission((addr_str));
 
     bool isfifo = mmap->type_isfifo((addr_str));
@@ -561,7 +561,7 @@ bool Periph_fpga::monitor(TermOutput& termout, uint seconds)
         termout.clear();
     }
     if ((seconds % registerMap->getUpdateInterval("fpga/temp")) == 0) {
-        read_fpga_temperature(termout, REG_FORMAT_FLOAT, R_UCP);
+        read_fpga_temperature(termout, REG_FORMAT_DOUBLE, R_UCP);
         termout.clear();
     }
     if ((seconds % registerMap->getUpdateInterval("fpga/hardware_version")) == 0) {
@@ -803,7 +803,7 @@ bool Periph_fpga::read_stamps(TermOutput& termout, int format)
 bool Periph_fpga::read_fpga_temperature(TermOutput& termout, int format, int mode)
 {
     bool retval = true;
-    float temp = my_current_temp;
+    double temp = my_current_temp;
     if (mode == R_UCP) {
         // cout << "read from UCP" << endl;
         uint32_t data[20];
@@ -813,9 +813,9 @@ bool Periph_fpga::read_fpga_temperature(TermOutput& termout, int format, int mod
         // ADC to engineering
         // see the constants: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_alttemp_sense.pdf
         // page 10
-        temp = ((693. * (float)data[0]) / 1024.) - 265;
+        temp = ((693. * (double)data[0]) / 1024.) - 265;
     }
-    float *temp_ptr = (float *)termout.val;
+    double *temp_ptr = (double *)termout.val;
     *temp_ptr = temp;
     termout.nof_vals = 1;
     termout.datatype = format;
@@ -1407,10 +1407,10 @@ bool Periph_fpga::read_wg_amplitude(TermOutput& termout, int format) {
         retval = Read(regname, &data[i]);
     }
 
-    float ampl;
-    float *_ptr = (float *)termout.val ;
+    double ampl;
+    double *_ptr = (double *)termout.val ;
     for (uint i=0; i< C_S_pn; i++) {
-        ampl = (float)data[i] / C_WG_AMPL_UNIT;
+        ampl = ((double)data[i]) / C_WG_AMPL_UNIT;
         *_ptr = ampl;
         _ptr++;
     }
@@ -1424,13 +1424,15 @@ bool Periph_fpga::write_wg_amplitude(uint32_t *data, uint32_t nvalues) {
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
 
-    float ampl;
+    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 = (float)data[i] * C_WG_AMPL_UNIT;
+        ampl = (*_ptr) * C_WG_AMPL_UNIT;
         reg[0] = (uint32_t)ampl;
         retval = Write(regname, 1, reg);
+        _ptr++;
     }
     delete[] reg;
     return retval;
@@ -1452,10 +1454,10 @@ bool Periph_fpga::read_wg_phase(TermOutput& termout, int format) {
         retval = Read(regname, &data[i]);
     }
 
-    float phase;
-    float *_ptr = (float *)termout.val ;
+    double phase;
+    double *_ptr = (double *)termout.val ;
     for (uint i=0; i< C_S_pn; i++) {
-        phase = ((float)data[i]) / C_WG_PHASE_UNIT;
+        phase = ((double)data[i]) / C_WG_PHASE_UNIT;
         *_ptr = phase;
         _ptr++;
     }
@@ -1471,11 +1473,13 @@ bool Periph_fpga::write_wg_phase (uint32_t *data, uint32_t nvalues) {
 
     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 = ((float)data[i]) * C_WG_PHASE_UNIT;
+        phase = (*_ptr) * C_WG_PHASE_UNIT;
         reg[0] = (uint32_t)phase;
         retval = Write(regname, 1, reg);
+        _ptr++;
     }
     delete[] reg;
     return retval;
@@ -1498,10 +1502,10 @@ bool Periph_fpga::read_wg_frequency(TermOutput& termout, int format) {
         retval = Read(regname, &data[i]);
     }
 
-    float freq;
-    float *_ptr = (float *)termout.val ;
+    double freq;
+    double *_ptr = (double *)termout.val ;
     for (uint i=0; i< C_S_pn; i++) {
-        freq = ((float)data[i] / C_WG_FREQ_UNIT) * C_F_adc;
+        freq = (((double)data[i]) / C_WG_FREQ_UNIT) * C_F_adc;
         *_ptr = freq;
         _ptr++;
     }
@@ -1515,21 +1519,22 @@ bool Periph_fpga::write_wg_frequency(uint32_t *data, uint32_t nvalues) {
     bool retval = true;
     uint32_t *reg = new uint32_t[2];
     
-    float freq, intpart;
+    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 = (float)data[i] / C_F_adc;
+        freq = (*_ptr) / C_F_adc;
         freq = modf(freq, &intpart);
         freq = freq * C_WG_FREQ_UNIT;
         reg[0] = (uint32_t)freq;
         retval = Write(regname, 1, reg);
+        _ptr++;
     }
     delete[] reg;
     return retval;
 }
 
-
 bool Periph_fpga::write_wdi_override(TermOutput& termout)
 {
     uint32_t data = 0xB007FAC7;
diff --git a/src/periph/fpga.h b/src/periph/fpga.h
index 08e6891c3e7cf37296dd252e36614a3433dadb7a..a0ab7c3a82e333afb17f1959ab0baed6627e4084 100644
--- a/src/periph/fpga.h
+++ b/src/periph/fpga.h
@@ -55,9 +55,7 @@ private:
   std::string my_current_fw_version;
   std::string my_current_hardware_version;
   std::string my_current_firmware_version;
-  float my_current_temp;
-  // float my_current_processing_enable;
-
+  double my_current_temp;
 
   std::vector<uint32_t> Scrap_RW_copy;
   std::vector<short> Weights_RW_copy;
diff --git a/src/registers.h b/src/registers.h
index 0c34e4a2f05024b6a96ef16999695b61dc8f37ec..fd78b384166e2da7db4ed3011d2b3bc2cb428cae 100644
--- a/src/registers.h
+++ b/src/registers.h
@@ -43,7 +43,8 @@
 #define REG_FORMAT_INT32    4
 #define REG_FORMAT_UINT32   5
 #define REG_FORMAT_FLOAT    6
-#define REG_FORMAT_BOOLEAN  7
+#define REG_FORMAT_DOUBLE   7
+#define REG_FORMAT_BOOLEAN  8
 
 class CMMap {
 private:
diff --git a/src/tools/util.h b/src/tools/util.h
index f9fa23005ebca23230de19f1674799f6c5b0898d..a2faf0f06faed2120c2705231ff9cfbca1524c8b 100644
--- a/src/tools/util.h
+++ b/src/tools/util.h
@@ -53,7 +53,6 @@ public:
 const static uint MAX_VAL_SIZE = 100;
 const static uint FORMAT_UNKNOWN = 0;
 const static uint FORMAT_STRING = 1;
-const static uint FORMAT_UINT32 = 2;
 
 struct StrData {
     char val[MAX_VAL_SIZE];
@@ -65,17 +64,14 @@ public:
     uint n_vals = 1;
     uint dataformat = FORMAT_UNKNOWN;
     StrData *strdata = NULL; 
-    uint32_t *intdata = NULL; 
 
     CMData(uint nvals=1) {
         n_vals = nvals;
         strdata = new StrData[n_vals];  
-        intdata = new uint32_t[n_vals];  
     };
 
     ~CMData() {
         if (strdata) delete[] strdata;
-        if (intdata) delete[] intdata;
     };
 
     void setFormat(uint format) {
@@ -91,7 +87,6 @@ public:
       //datatype = 0;
       for (uint i=0; i<n_vals; i++){
         clearStr(i);
-        clearInt(i); 
       }
     }
 
@@ -99,10 +94,6 @@ public:
         std::memset((void *)strdata[val_nr].val, 0, MAX_VAL_SIZE);
     }
     
-    void clearInt(uint val_nr) {
-        intdata[val_nr] = 0; 
-    }
-
     char *getStrPtr(uint val_nr) {
        return strdata[val_nr].val;
     }
@@ -114,14 +105,6 @@ public:
     std::string getStr(uint val_nr) {
        return std::string(strdata[val_nr].val);
     }
-
-    uint32_t getInt(uint val_nr) {
-       return intdata[val_nr];
-    }
-
-    void setInt(uint val_nr, uint val) {
-       intdata[val_nr] = (uint32_t)val;
-    }
 };