You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cg...@apache.org on 2024/09/02 03:35:44 UTC

(plc4x-extras) branch feature/merlot updated: Fixed read/write routine for simulated driver.

This is an automated email from the ASF dual-hosted git repository.

cgarcia pushed a commit to branch feature/merlot
in repository https://gitbox.apache.org/repos/asf/plc4x-extras.git


The following commit(s) were added to refs/heads/feature/merlot by this push:
     new 2cbad20  Fixed read/write routine for simulated driver.
2cbad20 is described below

commit 2cbad201a7cfb2412d9ba82ef8812845ed7a2eb0
Author: César García <ce...@ceos.com.ve>
AuthorDate: Sun Sep 1 23:34:48 2024 -0400

    Fixed read/write routine for simulated driver.
---
 .../org/apache/plc4x/merlot/api/PlcDevice.java     |   7 +-
 .../java/org/apache/plc4x/merlot/api/PlcItem.java  |   3 +-
 .../apache/plc4x/merlot/api/PlcTagFunction.java    |  47 +++++
 .../plc4x/merlot/api/command/DemoCommand002.java   |   5 +-
 .../merlot/api/core/PlcDeviceManagedService.java   |   4 +-
 .../plc4x/merlot/api/impl/PlcDeviceImpl.java       | 131 ++++++------
 .../apache/plc4x/merlot/api/impl/PlcGroupImpl.java |  24 ++-
 .../apache/plc4x/merlot/api/impl/PlcItemImpl.java  |  83 ++------
 .../plc4x/merlot/das/base/impl/BaseDeviceImpl.java |   4 -
 .../plc4x/merlot/das/base/impl/BaseItemImpl.java   |  36 ++--
 .../org/apache/plc4x/merlot/db/api/DBRecord.java   |  56 ++++-
 .../plc4x/merlot/db/api/DBRecordFactory.java       |   6 +-
 .../db/api/{DBRecord.java => DBWriterHandler.java} |   9 +-
 .../apache/plc4x/merlot/db/core/DBBaseFactory.java |  20 +-
 .../plc4x/merlot/db/core/DBBooleanFactory.java     |  54 +++--
 .../apache/plc4x/merlot/db/core/DBByteFactory.java |  69 ++++--
 .../plc4x/merlot/db/core/DBDoubleFactory.java      |  38 ++--
 .../plc4x/merlot/db/core/DBFloatFactory.java       |  48 +++--
 .../apache/plc4x/merlot/db/core/DBIntFactory.java  |  40 ++--
 .../apache/plc4x/merlot/db/core/DBLongFactory.java |  36 ++--
 .../merlot/db/core/DBRecordsManagedService.java    |  71 ++++---
 .../plc4x/merlot/db/core/DBShortFactory.java       |  41 ++--
 .../plc4x/merlot/db/core/DBStringFactory.java      |  35 ++--
 .../plc4x/merlot/db/core/DBUByteFactory.java       |  37 ++--
 .../apache/plc4x/merlot/db/core/DBUIntFactory.java |  37 ++--
 .../plc4x/merlot/db/core/DBULongFactory.java       |  39 ++--
 .../plc4x/merlot/db/core/DBUShortFactory.java      |  41 ++--
 .../plc4x/merlot/db/impl/DBWriterHandlerImpl.java  | 118 +++++++++++
 .../resources/OSGI-INF/blueprint/db-service.xml    |   7 +-
 .../pom.xml                                        |  31 ++-
 .../apache/plc4x/merlot/drv/mb/api/MyService.java  |  23 ++
 .../plc4x/merlot/drv/mb/api/MyServiceImpl.java     |  25 +++
 .../drv/mb/impl/ModbusPlcTagFunctionImpl.java      |  54 +++++
 .../resources/OSGI-INF/blueprint/my-service.xml    |  24 +++
 .../pom.xml                                        |  31 ++-
 .../apache/plc4x/merlot/drv/s7/api/MyService.java  |  23 ++
 .../plc4x/merlot/drv/s7/api/MyServiceImpl.java     |  25 +++
 .../merlot/drv/s7/impl/S7PlcTagFunctionImpl.java   |  54 +++++
 .../resources/OSGI-INF/blueprint/s7-service.xml}   |  38 ++--
 .../org.apache.plc4x.merlot.drv.simulated/pom.xml  |   3 +-
 .../impl/SimulatedPlcTagFunctionImpl.java          | 109 ++++++++++
 .../OSGI-INF/blueprint/simulated-drv-service.xml   |  24 ++-
 .../src/main/feature/feature.xml                   |   5 +-
 plc4j/tools/merlot/pom.xml                         | 231 +++++++++++++++++++--
 44 files changed, 1375 insertions(+), 471 deletions(-)

diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java
index a5b1b4a..dd6a7c7 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcDevice.java
@@ -130,12 +130,7 @@ public interface PlcDevice extends org.osgi.service.device.Device, org.osgi.serv
     *
     */    
     public List<PlcGroup> getGroups();
-    
-    /*
-    * 
-    */
-    public String getWritePlcTag(PlcTag plcTag, ByteBuf byteBuf, String... args);  
-    
+        
     /*
     *    
     */
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
index e14f33f..66c9199 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcItem.java
@@ -20,6 +20,7 @@ package org.apache.plc4x.merlot.api;
 
 import com.lmax.disruptor.RingBuffer;
 import io.netty.buffer.ByteBuf;
+
 import java.util.Date;
 import java.util.Hashtable;
 import java.util.UUID; 
@@ -221,6 +222,6 @@ public interface PlcItem {
     /*
     *
     */    
-    public void itemWrite();
+    public void itemWrite(final ByteBuf byteBuf, int offset);
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcTagFunction.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcTagFunction.java
new file mode 100644
index 0000000..a397d8a
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/PlcTagFunction.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.merlot.api;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.osgi.service.dal.Function;
+
+/**
+ * This function is intended for the construction of the write Tags. 
+ * It should expect a String representing a Tag or a PlcTag.
+ * In the case of BYTE-oriented drivers such as Modbus or S7, 
+ * priority should be given to writing bit arrays or byte arrays.
+ * In the case of Tag-oriented drivers such as Ethernet/IP, 
+ * handling should be done for each particular case. 
+ * 
+ */
+public interface PlcTagFunction  extends Function {
+    
+    /*
+    * PlcTag reference for constructing the String that represents 
+    * the write tag.
+    *
+    * @param plcTag PlcTag reference PlcTag 
+    * @paraf byteBuf ByteBuf
+    * @return 
+    */
+    public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf);
+    
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java
index df9151f..e9ba4c9 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/command/DemoCommand002.java
@@ -71,7 +71,7 @@ public class DemoCommand002  implements Action  {
                     
                         item = new PlcItemImpl.PlcItemBuilder("ITEM_00" + i).
                                     setItemDescription("THE ITEM 00" + i).
-                                    setItemId("RANDOM/foo_" +i + ":INT[10]").
+                                    setItemId("RANDOM/foo_" +i + ":BYTE[10]").
                                     setItemEnable(true).
                                     build(); 
                         
@@ -79,7 +79,8 @@ public class DemoCommand002  implements Action  {
                     
                     };
                     
-                    
+                    grupo1.enable();
+                    d.enable();
                 });
                         
         return null;
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java
index 8951193..851eced 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/core/PlcDeviceManagedService.java
@@ -62,7 +62,7 @@ public class PlcDeviceManagedService implements ManagedService, ConfigurationLis
     }
 
     public String getName() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     /*
@@ -175,7 +175,7 @@ public class PlcDeviceManagedService implements ManagedService, ConfigurationLis
 
     @Override
     public void configurationEvent(ConfigurationEvent event) {
-        LOGGER.info(">>> Cambio de configuración: " + event.getPid());
+        LOGGER.info("Configuration change: " + event.getPid());
     }
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
index 9ba4f08..1d57905 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcDeviceImpl.java
@@ -21,25 +21,27 @@ import com.lmax.disruptor.RingBuffer;
 import com.lmax.disruptor.SequenceBarrier;
 import com.lmax.disruptor.dsl.Disruptor;
 import com.lmax.disruptor.util.DaemonThreadFactory;
-import io.netty.buffer.ByteBuf;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Level;
 import static java.util.stream.Collectors.toList;
 import org.apache.commons.lang3.time.StopWatch;
+import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest.Builder;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.api.value.PlcValue;
-import org.apache.plc4x.java.simulated.tag.SimulatedTag;
 import org.apache.plc4x.merlot.api.PlcDevice;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.dal.Device;
@@ -48,8 +50,9 @@ import org.osgi.service.device.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.plc4x.merlot.api.PlcGroup;
-import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
 import org.apache.plc4x.merlot.scheduler.api.Job;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
 /*
@@ -66,7 +69,12 @@ public class PlcDeviceImpl implements PlcDevice {
     private static final String FILTER_DEVICE =  "(&(" + 
             org.osgi.framework.Constants.OBJECTCLASS + 
             "=" + PlcDevice.class.getName() + ")" +
-            "(" + PlcDevice.SERVICE_UID + "=*))";   
+            "(" + PlcDevice.SERVICE_UID + "=*))"; 
+    
+    private static String FILTER_PLCTAGFUNCTION =  "(&(" + 
+            org.osgi.framework.Constants.OBJECTCLASS + 
+            "=" + PlcTagFunction.class.getName() + ")" +
+            "(dal.function.device.UID=*))";    
     
     protected final BundleContext bc;
     protected boolean enable  = false;      
@@ -83,6 +91,9 @@ public class PlcDeviceImpl implements PlcDevice {
     private StopWatch watch = new StopWatch(); 
     int[] messageCounter = new int[2];
     
+    private PlcTagFunction  plcTagFunction = null;
+    private final ArrayList<ImmutablePair<String, Object[]>> writeBuffer = new ArrayList<>();
+    
     //
     Disruptor<PlcDeviceReadEvent> readDisruptor = 
                 new Disruptor<>(PlcDeviceReadEvent::new, BUFFER_SIZE, DaemonThreadFactory.INSTANCE);
@@ -133,7 +144,7 @@ public class PlcDeviceImpl implements PlcDevice {
                 readRingBuffer,
                 readSequenceBarrier,
                 (event, sequence, endofbatch)->{
-                    LOGGER.info("Ejecutando sequencia de lectura...");
+                    LOGGER.debug("Reader rutine...");
                     if (null != event.getPlcGroup()){
                         if (null != plcConnection) {
                             if (refPlcConnection.get().isConnected()) {
@@ -150,9 +161,9 @@ public class PlcDeviceImpl implements PlcDevice {
                                         event.getPlcGroup().getGroupItems().forEach((u,i) -> {
                                         final PlcValue plcValue = syncResponse.getPlcValue(i.getItemName());
                                         if (null == plcValue) {
-                                            LOGGER.info("Item[{}] = {} ", i.getItemName(),"Null value");
+                                            LOGGER.debug("Item[{}] = {} ", i.getItemName(),"Null value");
                                         } else {
-                                            LOGGER.info("Item[{}]  Read ", i.getItemName());
+                                            LOGGER.debug("Item[{}]  Read ", i.getItemName());
                                             i.setPlcValue(plcValue);
                                         }
                                     });
@@ -187,37 +198,39 @@ public class PlcDeviceImpl implements PlcDevice {
                     if (null != event.getPlcItem()){
                         if (null != plcConnection) {
                             if (refPlcConnection.get().isConnected()) {
-                                watch.start();
                                 if (messageCounter[0] == 0) {
                                     readProcessor.pause();
                                 }                                
-
                                 messageCounter[0]++;   
-                                
-                                final PlcItem plcItem = event.getPlcItem();
-                                final PlcTag plcTag = plcItem.getItemPlcTag();
-                                
-                                String strTag = getWritePlcTag(plcTag,
-                                                    event.getByteBuf());
-                                
-                                final PlcWriteRequest writeRequest = 
-                                        refPlcConnection.get().writeRequestBuilder().
-                                        addTagAddress("bar", strTag, event.getByteBuf().array()).
-                                        build();
-                                        
-                                //TODO: Agregar tiempo de supervision
-                                PlcWriteResponse writeResponse = 
-                                        writeRequest.execute().get();
-                                        
-                                LOGGER.info("Write to: " + event.getByteBuf().array());
-                                watch.stop();
-                                LOGGER.debug("Elapse time: " + watch.getTime());
-                                watch.reset();
+                                LOGGER.info("Writer sequence...");
+                                if (null != plcTagFunction) {  
+                                    writeBuffer.add(plcTagFunction.getStringTag(
+                                        event.getPlcItem().getItemPlcTag(), 
+                                        event.getByteBuf()));
+                                }
+                                                                       
+                                /*
+                                * A maximum of DEFAULT_WRITE_BATCH_SIZE or there
+                                * are no more messages in the ringbuffer, 
+                                * the write will proceed.
+                                */
                                 if ((messageCounter[0] > DEFAULT_WRITE_BATCH_SIZE) || (endofbatch)) {
-                                    readProcessor.pause();
+                                    if (!writeBuffer.isEmpty()) {
+                                        final Builder builder = refPlcConnection.get().writeRequestBuilder();
+                                        writeBuffer.forEach(i -> builder.addTagAddress(Long.toString(System.nanoTime()), i.left, i.right));
+                                        final PlcWriteRequest writeRequest = builder.build();
+                                        writeBuffer.clear();
+                                        //TODO: Max time of waiting
+                                        PlcWriteResponse writeResponse = 
+                                            writeRequest.execute().get(); 
+                                        //TODO: Change to debug
+                                        writeResponse.getTagNames().forEach( t->
+                                                LOGGER.info("Write tag[{}] is {}", t, writeResponse.getResponseCode(t))
+                                            );
+                                    }
+                                    readProcessor.restart();
                                     messageCounter[0] = 0;
-                                }                                
-                                
+                                }                                                                
                             }
                         }
                     }
@@ -255,7 +268,7 @@ public class PlcDeviceImpl implements PlcDevice {
             //Try to connect
             final String url = (String) deviceProperties.get(Device.SERVICE_DRIVER);
             try {
-                System.out.println("URL : " + url);
+                LOGGER.info("Device{} with url {}", Device.SERVICE_DRIVER, url);
                 plcConnection = plcDriver.getConnection(url);
                 plcConnection.connect();
                 refPlcConnection.set(plcConnection);
@@ -353,6 +366,7 @@ public class PlcDeviceImpl implements PlcDevice {
                 group.setGroupDeviceUid(UUID.fromString((String) deviceProperties.get(PlcDevice.SERVICE_UID)));
                 group.setPlcConnection(refPlcConnection);
                 group.setReadRingBuffer(readRingBuffer);
+                group.setWriteRingBuffer(writeRingBuffer);
                 deviceGroups.put(group.getGroupUid(), group);
                 bc.registerService(new String[]{Job.class.getName(), 
                     PlcGroup.class.getName()}, 
@@ -404,43 +418,34 @@ public class PlcDeviceImpl implements PlcDevice {
 
     @Override
     public void attach(PlcDriver driver) {
+        Collection<ServiceReference<PlcTagFunction>> serviceRefences = null;        
         LOGGER.info("Device: {} attach to driver {} ", deviceProperties.get(Device.SERVICE_NAME),  driver.getProtocolCode());
         this.plcDriver = driver;
+        
+        String filter = FILTER_PLCTAGFUNCTION.replace("*", plcDriver.getProtocolCode());
+
+        try {
+            serviceRefences = bc.getServiceReferences(PlcTagFunction.class, filter);
+        } catch (InvalidSyntaxException ex) {
+            LOGGER.info(ex.getMessage());
+        }
+        
+        if (null == serviceRefences) {
+            LOGGER.info("PlcTagFunction don´t found for {} driver.", plcDriver.getProtocolCode());
+            LOGGER.info("Query {}", filter);            
+        } else {
+            plcTagFunction = (PlcTagFunction) bc.getService((ServiceReference<PlcTagFunction>) serviceRefences.toArray()[0]);
+            LOGGER.info("PlcTagFunction assigned for {} driver.", plcDriver.getProtocolCode());            
+        }
+        
     }
 
     @Override
     public PlcConnection getPlcConnection() {
         return plcConnection;
     }
-        
-    @Override
-    public String getWritePlcTag(PlcTag plcTag, ByteBuf byteBuf, String... args) {
-        String strTag = null;
-        if (plcTag instanceof SimulatedTag) {
-            final SimulatedTag localTag = (SimulatedTag) plcTag;
-            switch (plcTag.getPlcValueType()) { 
-                case BOOL:;
-                    strTag =    localTag.getType().name() + "/" + 
-                                localTag.getName() +                             
-                                ":BOOL" + 
-                                "[" + 
-                                byteBuf.capacity() +
-                                "]";
-                break;
-                case BYTE:;
-                    strTag =    localTag.getType().name() + "/" + 
-                                localTag.getName() + 
-                                ":BYTE" +                             
-                                "[" + 
-                                byteBuf.capacity() +
-                                "]";                
-                break;
-
-            };
-        }
-        
-        return strTag;
-    }
+    
+    
     
     public static class PlcDeviceBuilder {
         private final BundleContext bc;        
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
index a65d004..5dec6e1 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcGroupImpl.java
@@ -20,6 +20,7 @@ import com.lmax.disruptor.RingBuffer;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -27,6 +28,7 @@ import org.apache.commons.lang3.time.StopWatch;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.merlot.scheduler.api.Job;
 import org.apache.plc4x.merlot.scheduler.api.JobContext;
@@ -50,6 +52,7 @@ public class PlcGroupImpl implements PlcGroup, Job {
     private UUID groupUid;
         
     private boolean enable = false;
+    private boolean isFirtsRun = true;
        
     private long groupTransmit = 0;
     private long groupReceives = 0;    
@@ -216,9 +219,11 @@ public class PlcGroupImpl implements PlcGroup, Job {
     }
            
     @Override
-    public void putItem(PlcItem item) {
-        if (!groupItems.containsKey(item.getItemUid())) {
-            groupItems.put(item.getItemUid(), item);
+    public void putItem(PlcItem plcItem) {
+        if (!groupItems.containsKey(plcItem.getItemUid())) {
+            plcItem.setRingBuffer(writeRingBuffer);
+            groupItems.put(plcItem.getItemUid(), plcItem);                
+
             //bc.registerService(PlcItem.class.getName(), item, item.getProperties());            
         }                   
     }
@@ -248,13 +253,22 @@ public class PlcGroupImpl implements PlcGroup, Job {
         if (enable) {
             if ((null != refPlcConnection) && (null != refPlcConnection.get())) {
                 if (refPlcConnection.get().isConnected()) {
+                    if (isFirtsRun) {
+                        groupItems.forEach((u,i) ->{
+                            Optional<PlcTag> refPlcTag = refPlcConnection.get().parseTagAddress(i.getItemId());
+                            if (refPlcTag.isPresent()) {
+                                i.setItemPlcTag(refPlcTag.get());
+                            } else {
+                                i.disable();
+                            }
+                        });
+                        isFirtsRun = false;
+                    }
                     //executeReadAllItems();
                     long sequenceId = readRingBuffer.next();
                     final PlcDeviceReadEvent readEvent = readRingBuffer.get(sequenceId);
                     readEvent.setPlcGroup(this);
                     readRingBuffer.publish(sequenceId);
-                    LOGGER.info("Elapse time: " + watch.getTime());
-                    watch.reset();
                 } else {
                     LOGGER.info("The driver is disconnected.");
                 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
index 9231461..456e190 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.api/src/main/java/org/apache/plc4x/merlot/api/impl/PlcItemImpl.java
@@ -61,8 +61,9 @@ public class PlcItemImpl implements PlcItem {
    
     private LinkedList<PlcItemListener> itemClients = null;
 
-    private byte[] itemInnerBuffer = null;
+    private byte[] itemInnerBuffer = null;   
     private ByteBuf itemBuffer = null;
+
         
     private long itemTransmit = 0;
     private long itemReceives = 0;    
@@ -75,7 +76,7 @@ public class PlcItemImpl implements PlcItem {
     private Date lastWriteDate;
     private Date lastErrorDate;
     
-    private RingBuffer<PlcDeviceWriteEvent> ringBuffer;
+    private RingBuffer<PlcDeviceWriteEvent> writeRingBuffer = null;
 
  
     public PlcItemImpl(PlcItemBuilder builder) {
@@ -223,6 +224,7 @@ public class PlcItemImpl implements PlcItem {
     @Override
     public void setPlcValue(PlcValue  plcvalue) {
         try {
+            //Creates the default buffer associated with the requested data.
             if (null == itemInnerBuffer) {
                 int size = (plcvalue instanceof PlcList) ? 
                         ((PlcList) plcvalue).getLength() * 
@@ -232,7 +234,8 @@ public class PlcItemImpl implements PlcItem {
                                                 new byte[size];
                 itemBuffer = Unpooled.wrappedBuffer(itemInnerBuffer);
             }
-
+            
+            //Transfers data to a byte buffer
             itemBuffer.resetWriterIndex();        
             if (plcvalue instanceof PlcList) {
                 ((PlcList) plcvalue).getList().forEach(v -> itemBuffer.writeBytes(v.getRaw()));
@@ -251,64 +254,6 @@ public class PlcItemImpl implements PlcItem {
         //Update all clients
         itemClients.forEach(c -> c.update());
 
-//        
-//        lock.lock();        
-//        try {
-//            this.itemPlcValue = plcvalue;
-//            itemBuffer.clear();
-//            switch (itemPlcTag.getPlcValueType()){
-//                case BYTE:
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeByte(p.getByte());});
-//                    break;
-//                case CHAR:                
-//                case STRING:
-//                    plcResponse.getAllStrings(itemUid.toString()).forEach(s -> {
-//                        itemBuffer.writeBytes(s.getBytes());
-//                    });  
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeBytes(p.getRaw());});                
-//                    break;
-//                case WORD:
-//                case USINT:
-//                case SINT:
-//                case UINT:
-//                case INT:
-//                case DINT:
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeShort(p.getShort());});                 
-//                    break;
-//                case UDINT:
-//                case ULINT:
-//                case LINT:    
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getLong());});                 
-//                    break;
-//                case BOOL:     
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeBoolean(p.getBoolean());});                 
-//                    break;
-//                case REAL:
-//                case LREAL: 
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeFloat(p.getFloat());});                  
-//                    break;
-//                case DATE_AND_TIME:  
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getDateTime().toEpochSecond(ZoneOffset.UTC));});                  
-//                    break;
-//                case DATE: 
-//                    plcResponse.getAllDates(itemUid.toString()).forEach(dt -> {
-//                        itemBuffer.writeLong(dt.toEpochDay());
-//                    }); 
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getDateTime().toLocalDate().toEpochDay());});                 
-//                    break;
-//                case TIME:
-//                    break;
-//                case TIME_OF_DAY:
-//                    itemPlcValue.getList().forEach(p -> {itemBuffer.writeLong(p.getTime().toEpochSecond(LocalDate.MAX, ZoneOffset.UTC));});                 
-//                    break;               
-//                default:
-//                    throw new NotImplementedException("The response type for datatype " + itemPlcValue.getPlcValueType() + " is not yet implemented");                
-//            }
-//        } catch (Exception ex) {
-//            
-//        } finally {
-//            lock.unlock();
-//        }
     }
 
     @Override
@@ -387,13 +332,21 @@ public class PlcItemImpl implements PlcItem {
 
     @Override
     public void setRingBuffer(RingBuffer<PlcDeviceWriteEvent> ringBuffer) {
-        this.ringBuffer = ringBuffer;
+        this.writeRingBuffer = ringBuffer;
     }
 
     @Override
-    public void itemWrite() {
-        
-        
+    public void itemWrite(final ByteBuf byteBuf, int offset) {
+        if (null == writeRingBuffer) {
+            System.out.println("*** Rinbuffer es null ***");
+            return;
+        }
+        long sequenceId = writeRingBuffer.next();
+        final PlcDeviceWriteEvent writeEvent = writeRingBuffer.get(sequenceId); 
+        writeEvent.setPlcItem(this);
+        writeEvent.setByteBuf(byteBuf);
+        writeEvent.setOffset(offset);
+        writeRingBuffer.publish(sequenceId);
     }
 
     @Override
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java
index 907fe18..148ca67 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseDeviceImpl.java
@@ -216,10 +216,6 @@ import org.apache.plc4x.merlot.api.PlcGroup;
         this.plcdriver = driver;
     }
 
-    @Override
-    public String getWritePlcTag(PlcTag plcTag, ByteBuf byteBuf, String... args) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
-    }
 
     @Override
     public PlcConnection getPlcConnection() {
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java
index 54286e6..81ff37a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.das.base/src/main/java/org/apache/plc4x/merlot/das/base/impl/BaseItemImpl.java
@@ -58,22 +58,22 @@ public class BaseItemImpl implements PlcItem {
 
     @Override
     public void setPlcValue(PlcValue plcvalue) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public PlcValue getItemPlcValue() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public ByteBuf getItemByteBuf() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public byte[] getInnerBuffer() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
     
     @Override
@@ -186,57 +186,57 @@ public class BaseItemImpl implements PlcItem {
 
     @Override
     public PlcTag getItemPlcTag() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public void setItemPlcTag(PlcTag itemplctag) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public PlcResponseCode getDataQuality() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public void setDataQuality(PlcResponseCode dataquality) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public void enable() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public void disable() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
     public Hashtable<String, Object> getProperties() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet."); 
     }
 
     @Override
     public void setRingBuffer(RingBuffer<PlcDeviceWriteEvent> ringBuffer) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+        throw new UnsupportedOperationException("Not supported yet."); 
     }
 
     @Override
-    public void itemWrite() {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+    public void addItemListener(PlcItemListener client) {
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
-    public void addItemListener(PlcItemListener client) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+    public void removeItemListener(PlcItemListener client) {
+        throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
-    public void removeItemListener(PlcItemListener client) {
-        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+    public void itemWrite(ByteBuf byteBuf, int offset) {
+        throw new UnsupportedOperationException("Not supported yet.");
     }
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
index e531f90..88c87e8 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
@@ -19,6 +19,60 @@
 package org.apache.plc4x.merlot.db.api;
 
 
-public interface DBRecord {
+
+import io.netty.buffer.ByteBuf;
+import java.util.Optional;
+import org.apache.plc4x.merlot.api.PlcItem;
+import org.epics.pvdata.pv.PVStructure;
+import org.epics.pvdatabase.PVRecord;
+
+
+public class DBRecord extends PVRecord  {   
+    protected static final String MONITOR_FIELDS = "field(write_value,"+         
+            "id,"+
+            "offset,"+
+            "description,"+
+            "scan_time,"+  
+            "scan_enable,"+
+            "write_enable,"+               
+            "display{limitLow,limitHigh},"+
+            "control{limitLow,limitHigh,minStep})";      
+    
+    protected static final String MONITOR_VALUE_FIELD = "field(value)";
+    protected static final String MONITOR_WRITE_FIELD = "field(write_value)"; 
+    
+    
+    protected PlcItem plcItem = null; 
+    protected ByteBuf innerBuffer = null; 
+    protected ByteBuf innerWriteBuffer = null;     
+    protected  int offset = 0;      
+    
+    public DBRecord(String recordName, PVStructure pvStructure) {
+        super(recordName, pvStructure);
+    }
+    
+    public Optional<PlcItem> getPlcItem(){
+        if (null == plcItem) Optional.empty();
+        return Optional.of(plcItem);
+    };
+    
+    public Optional<ByteBuf> getInnerBuffer(){
+        if (null == innerBuffer) Optional.empty();
+        return Optional.of(innerBuffer);
+    };  
+
+    public Optional<ByteBuf> getWriteBuffer(){
+        if (null == innerWriteBuffer) Optional.empty();
+        return Optional.of(innerWriteBuffer);
+    };    
+    
+    public int getOffset(){
+        return offset;
+    }
+    
+    public String getFieldsToMonitor(){
+        return MONITOR_VALUE_FIELD;
+    };
+    
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java
index acde979..a0dc98c 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecordFactory.java
@@ -23,10 +23,10 @@ import org.epics.pvdatabase.PVRecord;
 
 public interface DBRecordFactory {
     
-    public PVRecord create(String recordName);
+    public DBRecord create(String recordName);
     
-    public PVRecord createArray(String recordName, int length);
+    public DBRecord createArray(String recordName, int length);
         
-    public PVRecord create(String recordName, String[] fields);    
+    public DBRecord create(String recordName, String[] fields);    
         
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java
similarity index 78%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java
index e531f90..0cdb7d3 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBWriterHandler.java
@@ -18,7 +18,14 @@
  */
 package org.apache.plc4x.merlot.db.api;
 
+import org.epics.pvdata.monitor.MonitorRequester;
 
-public interface DBRecord {
+public interface DBWriterHandler extends MonitorRequester{
+    
+    
+    
+    public void putDBRecord(DBRecord dbRecord);
+    
+    public void removeDBRecord(DBRecord dbRecord);    
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java
index b81df55..69b11ce 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBaseFactory.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.apache.plc4x.merlot.db.api.DBRecordFactory;
+import org.epics.pvdata.copy.CreateRequest;
 import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVDouble;
 import org.epics.pvdata.pv.PVInt;
@@ -33,18 +35,19 @@ public class DBBaseFactory implements DBRecordFactory  {
     private static final Logger LOGGER = LoggerFactory.getLogger(DBBaseFactory.class); 
     
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
-    public PVRecord create(String recordName, String[] fields) {
-        PVRecord pvRecord = null;
+    public DBRecord create(String recordName, String[] fields) {
+        
+        DBRecord dbRecord = null;
         PVStructure structure = null;
         PVString pvString = null;
         PVBoolean pvBoolean = null;
@@ -65,12 +68,12 @@ public class DBBaseFactory implements DBRecordFactory  {
                 }
 
                 if (!isArray){
-                    pvRecord = create(recordName);
+                    dbRecord = create(recordName);
                 } else {
-                    pvRecord = createArray(recordName,lengthArray);
+                    dbRecord = createArray(recordName,lengthArray);
                 }
 
-                structure = pvRecord.getPVStructure();
+                structure = dbRecord.getPVStructure();
                 pvString = structure.getStringField("id");
                 pvString.put(fields[1]);   
             } else return null;
@@ -82,7 +85,6 @@ public class DBBaseFactory implements DBRecordFactory  {
             
             if (!fields[3].isEmpty()) {          
                 pvString = structure.getStringField("descriptor");
-                System.out.println("Valor de fields[3]: " + fields[3]);
                 pvString.put(fields[3]);
             } else return null;
 
@@ -145,7 +147,7 @@ public class DBBaseFactory implements DBRecordFactory  {
                 pvDouble.put(Double.parseDouble(fields[14]));
             }           
             
-            return pvRecord;
+            return dbRecord;
         } catch (Exception ex) {
             ex.printStackTrace();
             LOGGER.info(ex.toString());
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
index dc5260c..56f7b3c 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
@@ -18,10 +18,11 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -30,10 +31,8 @@ import org.epics.pvdata.factory.FieldFactory;
 import org.epics.pvdata.pv.FieldCreate;
 import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVBooleanArray;
-import org.epics.pvdata.pv.PVString;
 import org.epics.pvdata.pv.PVStructure;
 import org.epics.pvdata.pv.ScalarType;
-import org.epics.pvdatabase.PVRecord;
 
 
 public class DBBooleanFactory extends DBBaseFactory {
@@ -43,7 +42,7 @@ public class DBBooleanFactory extends DBBaseFactory {
     public DBBooleanFactory() {};
     
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvBoolean).
@@ -51,18 +50,19 @@ public class DBBooleanFactory extends DBBaseFactory {
             add("id", fieldCreate.createScalar(ScalarType.pvString)). 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).                
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+            add("write_value", fieldCreate.createScalar(ScalarType.pvBoolean)). 
             addAlarm().
             addTimeStamp().
             addDisplay().
             addControl(). 
             createPVStructure();    
-        PVRecord pvRecord = new DBBooleanRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();        
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,7 +71,8 @@ public class DBBooleanFactory extends DBBaseFactory {
             add("id", fieldCreate.createScalar(ScalarType.pvString)). 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).                
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)). 
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvBoolean, length)).
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -80,20 +81,19 @@ public class DBBooleanFactory extends DBBaseFactory {
         PVBooleanArray pvValue = (PVBooleanArray) pvStructure.getScalarArrayField("value", ScalarType.pvBoolean);
         pvValue.setCapacity(length);
         pvValue.setLength(length);        
-        PVRecord pvRecord = new DBBooleanRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBBooleanRecord(recordName,pvStructure);
+        return dbRecord;
     }
     
-    class DBBooleanRecord extends PVRecord implements PlcItemListener {
+    class DBBooleanRecord extends DBRecord implements PlcItemListener {
         
         private PVBoolean value;
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
-        private int offset = 0;             
-        
+        private PVBoolean write_value;        
+                 
         public DBBooleanRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getBooleanField("value");           
+            value = pvStructure.getBooleanField("value");
+            write_value = pvStructure.getBooleanField("write_value");              
         }    
 
         /**
@@ -103,8 +103,16 @@ public class DBBooleanFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-            if (null != plcItem )
-                plcItem.itemWrite();
+            if (null != plcItem) {    
+                System.out.println("Paso por Boolean");
+                if (value.get() != write_value.get()) {
+                    final PVBoolean isWriteEnbale = this.getPVStructure().getBooleanField("write_enable");
+                    if (isWriteEnbale.get()) {
+                        write_value.put(value.get());
+                        
+                    }
+                }
+            }               
         } 
 
         @Override
@@ -125,6 +133,12 @@ public class DBBooleanFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getBoolean(0))                    
                     value.put(innerBuffer.getBoolean(0));
         }
+
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }
+                                
     }
     
     
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
index daad838..d8646b6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
@@ -18,21 +18,26 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
 import org.epics.nt.NTScalarBuilder;
+import org.epics.pvdata.copy.PVCopy;
 import org.epics.pvdata.factory.FieldFactory;
 import org.epics.pvdata.pv.FieldCreate;
+import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVByte;
 import org.epics.pvdata.pv.PVByteArray;
 import org.epics.pvdata.pv.PVStructure;
 import org.epics.pvdata.pv.ScalarType;
+import org.epics.pvdatabase.PVListener;
 import org.epics.pvdatabase.PVRecord;
+import org.epics.pvdatabase.PVRecordField;
+import org.epics.pvdatabase.PVRecordStructure;
 
 
 public class DBByteFactory extends DBBaseFactory {
@@ -43,7 +48,7 @@ public class DBByteFactory extends DBBaseFactory {
     }
                 
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvByte).
@@ -52,18 +57,19 @@ public class DBByteFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).             
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)). 
+            add("write_value", fieldCreate.createScalar(ScalarType.pvByte)).                 
             addAlarm().
             addTimeStamp().
             addDisplay().
-            addControl(). 
+            addControl().                 
             createPVStructure();    
-        PVRecord pvRecord = new DBByteRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBByteRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();        
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -73,29 +79,31 @@ public class DBByteFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).                 
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).   
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvByte, length)).                
             addAlarm().
             addTimeStamp().
             addDisplay().
-            addControl(). 
+            addControl().                 
             createPVStructure();
         PVByteArray pvValue = (PVByteArray) pvStructure.getScalarArrayField("value", ScalarType.pvByte);
         pvValue.setCapacity(length);
         pvValue.setLength(length);              
-        PVRecord pvRecord = new DBByteRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBByteRecord(recordName,pvStructure);
+        return dbRecord;
     }
  
-    class DBByteRecord extends PVRecord implements PlcItemListener  {
-            
+    class DBByteRecord extends DBRecord implements PlcItemListener {
+                
         private PVByte value;
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
-        private int offset = 0;        
-        
+        private PVByte write_value;
+        private PVBoolean write_enable;
+              
         public DBByteRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getByteField("value");        
+            value = pvStructure.getByteField("value");
+            write_value = pvStructure.getByteField("write_value");
+            write_enable = pvStructure.getBooleanField("write_enable");
         }    
 
         /**
@@ -103,8 +111,17 @@ public class DBByteFactory extends DBBaseFactory {
          * The main code is here.
          */
         public void process()
-        {
-            super.process();
+        {           
+            if (null != plcItem) {                  
+                if (value.get() != write_value.get()) {
+                    if (write_enable.get()) {      
+                        write_value.put(value.get());                        
+                        innerWriteBuffer.clear();
+                        innerWriteBuffer.writeByte(write_value.get());
+                        super.process();
+                    }
+                }
+            }                     
         } 
 
         @Override
@@ -112,6 +129,7 @@ public class DBByteFactory extends DBBaseFactory {
             this.plcItem = plcItem;
             offset = this.getPVStructure().getIntField("offset").get() * Byte.BYTES;             
             innerBuffer = Unpooled.wrappedBuffer(plcItem.getInnerBuffer(), offset, Byte.BYTES);
+            innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
 
         @Override
@@ -123,9 +141,16 @@ public class DBByteFactory extends DBBaseFactory {
         public void update() {
             if (null != plcItem) {           
                 if (value.get() != innerBuffer.getByte(0))
-                value.put(innerBuffer.getByte(0));
+                    value.put(innerBuffer.getByte(0));
             }
         }
+       
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_FIELDS;
+        }        
+
+              
     }
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
index f139791..83d1d60 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
@@ -18,10 +18,11 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +41,7 @@ public class DBDoubleFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
 
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvDouble).
@@ -55,12 +56,12 @@ public class DBDoubleFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBDoubleRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBDoubleRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +71,8 @@ public class DBDoubleFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                  
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).                 
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).   
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvDouble, length)).                 
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -79,20 +81,20 @@ public class DBDoubleFactory extends DBBaseFactory {
         PVDoubleArray pvValue = (PVDoubleArray) pvStructure.getScalarArrayField("value", ScalarType.pvDouble);
         pvValue.setCapacity(length);
         pvValue.setLength(length);            
-        PVRecord pvRecord = new DBDoubleRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBDoubleRecord(recordName,pvStructure);
+        return dbRecord;
     }
     
-    class DBDoubleRecord extends PVRecord implements PlcItemListener {
+    class DBDoubleRecord extends DBRecord implements PlcItemListener {
     
         private PVDouble value;
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVDouble write_value;        
         private int offset = 0;          
         
         public DBDoubleRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getDoubleField("value");           
+            value = pvStructure.getDoubleField("value");  
+            write_value = pvStructure.getDoubleField("write_value");              
         }    
 
         /**
@@ -102,6 +104,11 @@ public class DBDoubleFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
+            if (null != plcItem) {   
+                System.out.println("Paso por Double");
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }                
         }        
 
         @Override
@@ -122,6 +129,11 @@ public class DBDoubleFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getDouble(0))
                 value.put(innerBuffer.getDouble(0));
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     } 
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
index 135a994..19f0e3e 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
@@ -18,16 +18,17 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
 import org.epics.nt.NTScalarBuilder;
 import org.epics.pvdata.factory.FieldFactory;
 import org.epics.pvdata.pv.FieldCreate;
+import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVFloat;
 import org.epics.pvdata.pv.PVFloatArray;
 import org.epics.pvdata.pv.PVString;
@@ -41,7 +42,7 @@ public class DBFloatFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();    
     
     @Override
-    public PVRecord create(String recordName) {              
+    public DBRecord create(String recordName) {              
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvFloat).
@@ -56,12 +57,12 @@ public class DBFloatFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBFloatRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBFloatRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,7 +72,8 @@ public class DBFloatFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                   
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).               
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).  
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvFloat, length)).                
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -80,31 +82,38 @@ public class DBFloatFactory extends DBBaseFactory {
         PVFloatArray pvValue = (PVFloatArray) pvStructure.getScalarArrayField("value", ScalarType.pvFloat);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBFloatRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBFloatRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
-    class DBFloatRecord extends PVRecord implements PlcItemListener {
+    class DBFloatRecord extends DBRecord implements PlcItemListener {
     
         private PVFloat value;  
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVFloat write_value;         
         private int offset = 0;        
         
         public DBFloatRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
             value = pvStructure.getFloatField("value");
+            write_value = pvStructure.getFloatField("write_value");            
         }    
 
         /**
-         * Implement real time data to the record.
-         * The main code is here.
-         */
+        * Implement real time data to the record.
+        * The main code is here.
+        */
         public void process()
         {
             super.process();
-            if (null != plcItem )
-                plcItem.itemWrite();
+            if (null != plcItem) {    
+                System.out.println("Paso por Float");
+                if (value.get() != write_value.get()) {
+                    final PVBoolean isWriteEnbale = this.getPVStructure().getBooleanField("write_enable");
+                    if (isWriteEnbale.get()) {
+                        write_value.put(value.get());
+                    }
+                }
+            }             
         }        
 
         @Override
@@ -125,6 +134,11 @@ public class DBFloatFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getFloat(0))
                 value.put(innerBuffer.getFloat(0));
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }  
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
index e1825b4..955a6ce 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBIntFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();   
 
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvInt).
@@ -55,12 +55,12 @@ public class DBIntFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBIntRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBIntRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +70,8 @@ public class DBIntFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).               
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)). 
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvInt, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -79,20 +80,20 @@ public class DBIntFactory extends DBBaseFactory {
         PVIntArray pvValue = (PVIntArray) pvStructure.getScalarArrayField("value", ScalarType.pvInt);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBIntRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBIntRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
-    class DBIntRecord extends PVRecord implements PlcItemListener {    
+    class DBIntRecord extends DBRecord implements PlcItemListener {    
     
-        private PVInt value;   
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVInt value; 
+        private PVInt write_value;         
         private int offset = 0;         
         
         public DBIntRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getIntField("value");          
+            value = pvStructure.getIntField("value");  
+            write_value = pvStructure.getIntField("write_value");              
         }    
 
         /**
@@ -102,7 +103,11 @@ public class DBIntFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-
+            if (null != plcItem) {   
+                System.out.println("Paso por Int");
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }             
         }  
 
         @Override
@@ -123,6 +128,11 @@ public class DBIntFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getInt(0))
                 value.put(innerBuffer.getInt(0));
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }
 }
                
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
index 1df1207..aeb59fb 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBLongFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
 
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvLong).
@@ -55,12 +55,12 @@ public class DBLongFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBLongRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBLongRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +70,8 @@ public class DBLongFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).               
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).  
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvLong, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -79,20 +80,20 @@ public class DBLongFactory extends DBBaseFactory {
         PVLongArray pvValue = (PVLongArray) pvStructure.getScalarArrayField("value", ScalarType.pvLong);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBLongRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBLongRecord(recordName,pvStructure);
+        return dbRecord;
     }
       
-    class DBLongRecord extends PVRecord implements PlcItemListener {    
+    class DBLongRecord extends DBRecord implements PlcItemListener {    
     
         private PVLong value;
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVLong write_value;
         private int offset = 0;         
 
         public DBLongRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getLongField("value");           
+            value = pvStructure.getLongField("value");  
+            write_value = pvStructure.getLongField("write_value");            
         }    
 
         /**
@@ -102,6 +103,10 @@ public class DBLongFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
+            if (null != plcItem) {                       
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }               
 
         }        
 
@@ -123,5 +128,10 @@ public class DBLongFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getLong(0))
                 value.put(innerBuffer.getLong(0));
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }              
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java
index b9330a1..696de76 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBRecordsManagedService.java
@@ -37,10 +37,21 @@ import org.apache.plc4x.merlot.api.PlcDevice;
 import org.apache.plc4x.merlot.api.PlcGeneralFunction;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.apache.plc4x.merlot.db.api.DBWriterHandler;
+import org.epics.pvdata.copy.CreateRequest;
+import org.epics.pvdata.misc.BitSet;
+import org.epics.pvdata.monitor.Monitor;
+import org.epics.pvdata.monitor.MonitorElement;
+import org.epics.pvdata.monitor.MonitorRequester;
+import org.epics.pvdata.pv.MessageType;
 import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVStructure;
+import org.epics.pvdata.pv.Status;
+import org.epics.pvdata.pv.Structure;
 import org.epics.pvdatabase.PVDatabase;
 import org.epics.pvdatabase.PVRecord;
+import org.epics.pvdatabase.pva.MonitorFactory;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -53,26 +64,31 @@ import org.slf4j.LoggerFactory;
 public class DBRecordsManagedService implements ManagedServiceFactory, Job {
     
     private static final Logger LOGGER = LoggerFactory.getLogger(DBRecordsManagedService.class);  
+    private static final String DEFAULT_REQUEST = "field(write_value,scan_rate,scan_enable,control.limitLow)";
+    private String filter =  "(&(" + Constants.OBJECTCLASS + "=" + DBRecordFactory.class.getName() + ")"+
+                           "(db.record.type=*))";    
+    
     private final PlcGeneralFunction generalFunction;
     private final PVDatabase master;
     private static Map<String, Dictionary<String, ?>> waitingConfigs = null;    
     static final String PID = "org.apache.plc4x.merlot.db.records";   
     static final String FILE_PATH = "felix.fileinstall.filename";
  
-    private String filter =  "(&(" + Constants.OBJECTCLASS + "=" + DBRecordFactory.class.getName() + ")"+
-                           "(db.record.type=*))";
-
     private ServiceReference[] references = null;    
     private final BundleContext bundleContext; 
     
     private final DBControl dbControl;
-
+    private final DBWriterHandler writerHandler;
+    
+    
     public DBRecordsManagedService(BundleContext bundleContext,
                                    PVDatabase master,
-                                   PlcGeneralFunction generalFunction) {
+                                   PlcGeneralFunction generalFunction,
+                                   DBWriterHandler writerHandler) {
         this.bundleContext = bundleContext;
+        this.master = master;        
         this.generalFunction = generalFunction;        
-        this.master = master;
+        this.writerHandler = writerHandler;
         this.dbControl = null;
         waitingConfigs = Collections.synchronizedMap(new HashMap<String, Dictionary<String, ?>>());
 
@@ -85,8 +101,8 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
 
     /*
     * All PvRecords are loaded from the configuration file and validated 
-    * against existing Devices.
-    * If the Device does not exist, the PvRecords are not loaded and wait 
+    * against existing PlcDevices.
+    * If the PlcDevice does not exist, the PvRecords are not loaded and wait 
     * for the device to be present. 
     * TODO: If the PlcItem associated with the PvRecord does not exist, 
     *       it can be passed to a waiting queue.
@@ -99,8 +115,10 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
         PVRecord record = null;
         String device = null;  
         String strScalarType = null; 
-        List<PVRecord> pvRecords = new ArrayList();
+        List<DBRecord> dbRecords = new ArrayList();
         String filename = (String) props.get("felix.fileinstall.filename");
+        
+  
 
         if (props.size() < 3){
             waitingConfigs.put(pid, props);  
@@ -114,11 +132,11 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
                 device = filename.substring(start+1, end);
             }
             if (device==null){
-                LOGGER.debug("Bad configuration name found: " + filename);
+                LOGGER.info("Bad configuration name found: " + filename);
                 return;
             }
         } else {
-                LOGGER.debug("Configuration file name not found.");
+                LOGGER.info("Configuration file name not found.");
                 return;
         }
         
@@ -126,7 +144,7 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
         PlcDevice plcDevice = getDevice(device);
         
         if (plcDevice == null){
-            LOGGER.debug("Device driver [" + device + "] is not deployed.");
+            LOGGER.info("Device driver [" + device + "] is not deployed.");
             waitingConfigs.put(device, props); 
             return;
         }
@@ -134,13 +152,13 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
         PlcConnection connPlc = plcDevice.getPlcConnection();
         
         if (connPlc == null){
-            LOGGER.debug("Device driver [" + device + "] native driver is not present.");
+            LOGGER.info("Device driver [" + device + "] native driver is not present.");
             waitingConfigs.put(device, props); 
             return;            
         }
         
         if(!connPlc.isConnected()){
-            LOGGER.debug("Device driver [" + device + "] is not connected.");
+            LOGGER.info("Device driver [" + device + "] is not connected.");
             waitingConfigs.put(device, props); 
             return;            
         }
@@ -166,28 +184,30 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
                 recordFactory = getRecordFactory(strScalarType);
                 
                 if (recordFactory != null){
-                    PVRecord pvRecord = recordFactory.create(key.toString(), dataFields);
+                    DBRecord dbRecord = recordFactory.create(key.toString(), dataFields);
                     
-                    if (pvRecord != null){
-                        pvRecords.add(pvRecord);
+                    if (dbRecord != null){
+                        dbRecords.add(dbRecord);
                     } else {
                         LOGGER.info("PVRecord '" + key +"' could not be created.");
                     }
                 }
             }
-            
-            //Si todo OK, los agregoa a la base de datos          
-            pvRecords.forEach(pvr -> {
-                
+                        
+            //Si todo OK, los agregoa a la base de datos  
+            LOGGER.info("Agrega la lista de Records...");
+            dbRecords.forEach(pvr -> {                
                 PVStructure structure = pvr.getPVStructure();
                 PVBoolean pvScanEnable = structure.getBooleanField("scan_enable");
                 pvScanEnable.put(false);   
-                String id = structure.getStringField("id").get();
-                
+                String id = structure.getStringField("id").get();   
+                LOGGER.info("Agrega la lista de Records... {}",id);
                 Optional<PlcItem> plcItem = generalFunction.getPlcItem(id);
                 if (plcItem.isPresent()) {
                     plcItem.get().addItemListener((PlcItemListener) pvr);
                     master.addRecord(pvr); 
+                    LOGGER.info("Agreg un Record a la base de datos {}", pvr.getRecordName());                    
+                    writerHandler.putDBRecord(pvr);
                 }
                 
             });
@@ -213,7 +233,7 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
             try {
                 updated(pid,props);
             } catch (ConfigurationException ex) {
-                LOGGER.debug("Problem updating [" + key +"] from waiting list." );
+                LOGGER.info("Problem updating [" + key +"] from waiting list." );
             }
         }
     }    
@@ -242,10 +262,9 @@ public class DBRecordsManagedService implements ManagedServiceFactory, Job {
             if (refDev == null) LOGGER.info("Device [" + device + "] don't found");
             return refDev;            
         } catch (Exception ex){
-            LOGGER.debug("getDriver: " + ex.toString());
+            LOGGER.info("getDriver: " + ex.toString());
         }
         return null;
     }    
-
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
index 547a21a..a48584d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -29,6 +29,7 @@ import org.epics.nt.NTScalarBuilder;
 import org.epics.pvdata.factory.FieldFactory;
 import org.epics.pvdata.pv.FieldBuilder;
 import org.epics.pvdata.pv.FieldCreate;
+import org.epics.pvdata.pv.PVBoolean;
 import org.epics.pvdata.pv.PVShort;
 import org.epics.pvdata.pv.PVShortArray;
 import org.epics.pvdata.pv.PVString;
@@ -42,7 +43,7 @@ public class DBShortFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
        
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         FieldBuilder fb = fieldCreate.createFieldBuilder();
 
@@ -59,12 +60,12 @@ public class DBShortFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();          
-        PVRecord pvRecord = new DBShortRecord(recordName,pvStructure);      
-        return pvRecord;
+        DBRecord dbRecord = new DBShortRecord(recordName,pvStructure);      
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName,int length) {
+    public DBRecord createArray(String recordName,int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
 
@@ -75,7 +76,8 @@ public class DBShortFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).              
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)). 
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvShort, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -84,20 +86,20 @@ public class DBShortFactory extends DBBaseFactory {
         PVShortArray pvValue = (PVShortArray) pvStructure.getScalarArrayField("value", ScalarType.pvShort);
         pvValue.setCapacity(length);
         pvValue.setLength(length);
-        PVRecord pvRecord = new DBShortRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBShortRecord(recordName,pvStructure);
+        return dbRecord;
     }
            
-    class DBShortRecord extends PVRecord implements PlcItemListener {    
+    class DBShortRecord extends DBRecord implements PlcItemListener {    
     
         private PVShort value; 
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVShort write_value;         
         private int offset = 0;
     
         public DBShortRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
             value = pvStructure.getShortField("value");
+            write_value = pvStructure.getShortField("write_value");            
         }    
 
         /**
@@ -107,8 +109,14 @@ public class DBShortFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-            if (null != plcItem )
-                plcItem.itemWrite();
+            if (null != plcItem) {                       
+                if (value.get() != write_value.get()) {
+                    final PVBoolean isWriteEnbale = this.getPVStructure().getBooleanField("write_enable");
+                    if (isWriteEnbale.get()) {
+                        write_value.put(value.get());
+                    }
+                }
+            }               
         }
 
         @Override
@@ -130,6 +138,11 @@ public class DBShortFactory extends DBBaseFactory {
                 value.put(innerBuffer.getShort(0));
             }
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }
            
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
index eef316c..8692137 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
@@ -18,11 +18,11 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import io.netty.util.CharsetUtil;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -41,7 +41,7 @@ public class DBStringFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
            
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvString).
@@ -56,12 +56,12 @@ public class DBStringFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBStringRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBStringRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,7 +71,8 @@ public class DBStringFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                  
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).              
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvString, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -80,15 +81,15 @@ public class DBStringFactory extends DBBaseFactory {
         PVStringArray pvValue = (PVStringArray) pvStructure.getScalarArrayField("value", ScalarType.pvString);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBStringRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBStringRecord(recordName,pvStructure);
+        return dbRecord;
     }
     
-    class DBStringRecord extends PVRecord implements PlcItemListener {
+    class DBStringRecord extends DBRecord implements PlcItemListener {
     
         private PVString value;  
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVString write_value;        
+
         private int offset = 0;           
         
         public DBStringRecord(String recordName,PVStructure pvStructure) {
@@ -104,7 +105,10 @@ public class DBStringFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-
+            if (null != plcItem) {                       
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }               
         }    
 
         @Override
@@ -124,6 +128,11 @@ public class DBStringFactory extends DBBaseFactory {
                 if (!value.get().matches(innerBuffer.toString(CharsetUtil.UTF_8)))
                     value.put( innerBuffer.toString(CharsetUtil.UTF_8) );
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }    
         
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
index 53cfe7d..11bf58a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBUByteFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
            
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvByte).
@@ -55,12 +55,12 @@ public class DBUByteFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBUByteRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBUByteRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -70,7 +70,8 @@ public class DBUByteFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                  
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).            
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).  
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvUByte, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -79,20 +80,21 @@ public class DBUByteFactory extends DBBaseFactory {
         PVUByteArray pvValue = (PVUByteArray) pvStructure.getScalarArrayField("value", ScalarType.pvUByte);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBUByteRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBUByteRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
-    class DBUByteRecord extends PVRecord implements PlcItemListener {
+    class DBUByteRecord extends DBRecord implements PlcItemListener {
         
         private PVUByte value; 
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVUByte write_value;         
+
         private int offset = 0;           
         
         public DBUByteRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
             value = (PVUByte) pvStructure.getByteField("value");
+            write_value = (PVUByte) pvStructure.getByteField("write_value");
         }    
 
         /**
@@ -102,7 +104,11 @@ public class DBUByteFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-
+            if (null != plcItem) {    
+                System.out.println("Paso por UByte");                
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }               
         }
 
         @Override
@@ -124,6 +130,11 @@ public class DBUByteFactory extends DBBaseFactory {
                     value.put((byte) innerBuffer.getUnsignedByte(offset));
                 }
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }
      
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
index 54d2127..3235740 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -40,7 +40,7 @@ public class DBUIntFactory extends DBBaseFactory {
     private static FieldCreate fieldCreate = FieldFactory.getFieldCreate();
     
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvUInt).
@@ -55,12 +55,12 @@ public class DBUIntFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBUIntRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBUIntRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -71,6 +71,7 @@ public class DBUIntFactory extends DBBaseFactory {
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
             add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvUInt, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -79,20 +80,21 @@ public class DBUIntFactory extends DBBaseFactory {
         PVUIntArray pvValue = (PVUIntArray) pvStructure.getScalarArrayField("value", ScalarType.pvUInt);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBUIntRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBUIntRecord(recordName,pvStructure);
+        return dbRecord;
     }
     
-    class DBUIntRecord extends PVRecord implements PlcItemListener {
+    class DBUIntRecord extends DBRecord implements PlcItemListener {
         
         private PVUInt value; 
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVUInt write_value;         
+
         private int offset = 0;             
         
         public DBUIntRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = (PVUInt) pvStructure.getIntField("value");             
+            value = (PVUInt) pvStructure.getIntField("value");   
+            write_value = (PVUInt) pvStructure.getIntField("write_value");              
         }    
 
         /**
@@ -102,7 +104,11 @@ public class DBUIntFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-
+            if (null != plcItem) {   
+                System.out.println("Paso por UInt");                
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }              
         } 
 
         @Override
@@ -123,6 +129,11 @@ public class DBUIntFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getUnsignedInt(offset))
                 value.put((byte) innerBuffer.getUnsignedInt(offset));
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }        
     }
     
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
index 6d191f5..4384d6d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -42,7 +42,7 @@ public class DBULongFactory extends DBBaseFactory {
     public DBULongFactory() {}
          
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvULong).
@@ -57,12 +57,12 @@ public class DBULongFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBULongRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBULongRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -72,7 +72,8 @@ public class DBULongFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                  
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).                
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).    
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvULong, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -81,20 +82,21 @@ public class DBULongFactory extends DBBaseFactory {
         PVULongArray pvValue = (PVULongArray) pvStructure.getScalarArrayField("value", ScalarType.pvULong);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBULongRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBULongRecord(recordName,pvStructure);
+        return dbRecord;
     }
     
-    class DBULongRecord extends PVRecord implements PlcItemListener  {
+    class DBULongRecord extends DBRecord implements PlcItemListener  {
        
         private PVULong value;
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVULong write_value;        
+
         private int offset = 0;           
         
         DBULongRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = (PVULong) pvStructure.getLongField("value");           
+            value = (PVULong) pvStructure.getLongField("value"); 
+            write_value = (PVULong) pvStructure.getLongField("write_value");             
         }    
 
         /**
@@ -104,7 +106,10 @@ public class DBULongFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-
+            if (null != plcItem) {                       
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }              
         }    
 
         @Override
@@ -125,6 +130,12 @@ public class DBULongFactory extends DBBaseFactory {
                 if (value.get() != innerBuffer.getUnsignedMedium(offset))
                 value.put(innerBuffer.getUnsignedMedium(offset));
         }
+        
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }
+        
     }
       
 }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
index 8d31755..32a4643 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.merlot.db.core;
 
-import io.grpc.netty.shaded.io.netty.buffer.ByteBuf;
-import io.grpc.netty.shaded.io.netty.buffer.Unpooled;
+import io.netty.buffer.Unpooled;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
+import org.apache.plc4x.merlot.db.api.DBRecord;
 import org.epics.nt.NTScalar;
 import org.epics.nt.NTScalarArray;
 import org.epics.nt.NTScalarArrayBuilder;
@@ -42,7 +42,7 @@ public class DBUShortFactory extends DBBaseFactory {
     public DBUShortFactory() {}    
     
     @Override
-    public PVRecord create(String recordName) {
+    public DBRecord create(String recordName) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvUShort).
@@ -57,12 +57,12 @@ public class DBUShortFactory extends DBBaseFactory {
             addDisplay().
             addControl(). 
             createPVStructure();   
-        PVRecord pvRecord = new DBUShortRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBUShortRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
     @Override
-    public PVRecord createArray(String recordName, int length) {
+    public DBRecord createArray(String recordName, int length) {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();                
         NTScalarArrayBuilder ntScalarArrayBuilder = NTScalarArray.createBuilder();
         PVStructure pvStructure = ntScalarArrayBuilder.
@@ -72,7 +72,8 @@ public class DBUShortFactory extends DBBaseFactory {
             add("offset", fieldCreate.createScalar(ScalarType.pvInt)).                 
             add("scan_rate", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
-            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).             
+            add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).   
+            add("write_value", fieldCreate.createFixedScalarArray(ScalarType.pvUShort, length)).                   
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -81,20 +82,21 @@ public class DBUShortFactory extends DBBaseFactory {
         PVUShortArray pvValue = (PVUShortArray) pvStructure.getScalarArrayField("value", ScalarType.pvUShort);
         pvValue.setCapacity(length);
         pvValue.setLength(length);               
-        PVRecord pvRecord = new DBUShortRecord(recordName,pvStructure);
-        return pvRecord;
+        DBRecord dbRecord = new DBUShortRecord(recordName,pvStructure);
+        return dbRecord;
     }
 
-    class DBUShortRecord extends PVRecord implements PlcItemListener{
+    class DBUShortRecord extends DBRecord implements PlcItemListener{
     
         private PVUShort value;
-        private PlcItem plcItem = null;
-        private ByteBuf innerBuffer = null;
+        private PVUShort write_value;        
+
         private int offset = 0;
         
         private DBUShortRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = (PVUShort) pvStructure.getShortField("value");             
+            value = (PVUShort) pvStructure.getShortField("value");
+            write_value = (PVUShort) pvStructure.getShortField("write_value");             
         }    
 
         /**
@@ -104,8 +106,11 @@ public class DBUShortFactory extends DBBaseFactory {
         public void process()
         {
             super.process();
-            if (null != plcItem )
-                plcItem.itemWrite();            
+            if (null != plcItem) {  
+                System.out.println("Paso por UShort");                
+                if (value.get() != write_value.get())
+                    write_value.put(value.get());
+            }               
         }  
 
         @Override
@@ -127,8 +132,10 @@ public class DBUShortFactory extends DBBaseFactory {
                         value.put( (short) innerBuffer.getUnsignedShort(offset));
         }
 
-
-
+        @Override
+        public String getFieldsToMonitor() {
+            return MONITOR_WRITE_FIELD;
+        }
 
     }
           
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
new file mode 100644
index 0000000..60b8bd8
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.merlot.db.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.apache.plc4x.merlot.db.api.DBWriterHandler;
+import org.epics.pvdata.copy.CreateRequest;
+import org.epics.pvdata.misc.BitSet;
+import org.epics.pvdata.monitor.Monitor;
+import org.epics.pvdata.monitor.MonitorElement;
+import org.epics.pvdata.pv.MessageType;
+import org.epics.pvdata.pv.PVStructure;
+import org.epics.pvdata.pv.Status;
+import org.epics.pvdata.pv.Structure;
+import org.epics.pvdatabase.pva.MonitorFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+* This service is responsible for calling the writing of a PvRecord through 
+* the associated PlcItem.
+*/
+public class DBWriterHandlerImpl implements DBWriterHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DBWriterHandlerImpl.class);
+    private  CreateRequest createRequest = CreateRequest.create();
+    private Map<Monitor, DBRecord> recordMonitors = new HashMap<>();
+    
+    private MonitorElement element  = null;
+    private PVStructure structure   = null;
+    private BitSet changedBitSet    = null;
+    private BitSet overrunBitSet    = null;
+    
+    @Override
+    public void monitorConnect(Status status, Monitor monitor, Structure structure) {
+
+    }  
+
+    @Override
+    public void monitorEvent(Monitor monitor) {
+        try 
+        {
+            element = monitor.poll();
+            structure = element.getPVStructure();
+            changedBitSet = element.getChangedBitSet();
+            overrunBitSet = element.getOverrunBitSet();
+
+            if ((recordMonitors.containsKey(monitor)) && 
+                 structure.getBooleanField("write_enable").get()) {
+                if (changedBitSet.get(1) && 
+                    (changedBitSet.length() == 2) &&
+                    overrunBitSet.isEmpty()) {
+
+                    final DBRecord dbRecord = recordMonitors.get(monitor);
+                    final Optional<PlcItem> refPlcItem = dbRecord.getPlcItem(); 
+
+                    refPlcItem.get().itemWrite(dbRecord.getWriteBuffer().get(), dbRecord.getOffset());       
+
+                }
+            }
+        } catch (Exception ex) {
+             LOGGER.info(ex.getMessage());
+        } finally {
+            monitor.release(element);             
+        }        
+    }
+
+      
+    @Override
+    public void unlisten(Monitor monitor) {
+        recordMonitors.remove(monitor);
+    }
+
+    @Override
+    public String getRequesterName() {
+        return "getRequesterName()";
+    }
+
+    @Override
+    public void message(String message, MessageType messageType) {
+        
+    }
+
+    @Override
+    public void putDBRecord(DBRecord dbRecord) {
+        LOGGER.debug("Monitor with fields =  {}", dbRecord.getFieldsToMonitor());
+        PVStructure request = createRequest.createRequest(dbRecord.getFieldsToMonitor());
+        Monitor monitor = MonitorFactory.create(dbRecord, this, request);
+        recordMonitors.put(monitor, dbRecord);
+        monitor.start();
+    }
+
+    @Override
+    public void removeDBRecord(DBRecord dbRecord) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
index dd492f5..cf9d78a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/resources/OSGI-INF/blueprint/db-service.xml
@@ -53,13 +53,16 @@
           scope="singleton">
         <property name="bundleContext" ref="blueprintBundleContext"/>
     </bean>
+    
+    <bean id="DBWriterHandlerImpl" class="org.apache.plc4x.merlot.db.impl.DBWriterHandlerImpl"/>    
 
     <bean id="DBRecordsManagedService" 
         class="org.apache.plc4x.merlot.db.core.DBRecordsManagedService" 
         scope="singleton">
         <argument ref="blueprintBundleContext" />
         <argument ref="DBBean" />        
-        <argument ref="refPlcGeneralFunction" />        
+        <argument ref="refPlcGeneralFunction" />  
+        <argument ref="DBWriterHandlerImpl" />               
     </bean>
     
     <bean id="DBRPCReferenceListener" 
@@ -197,6 +200,8 @@
              ref="DBChannelProvider" 
              interface="org.epics.pvaccess.client.ChannelProvider"/>
     
+    <service ref="DBWriterHandlerImpl" interface="org.apache.plc4x.merlot.db.api.DBWriterHandler" />    
+    
 <!--    <service id="MasterDBControl" ref="DBControl" auto-export="interfaces">
         <service-properties>
             <entry key="scheduler.name" value="MasterDBControl"/>  
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/pom.xml
similarity index 72%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/pom.xml
index dd7f1ce..105aeee 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/pom.xml
@@ -21,31 +21,31 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <artifactId>merlot</artifactId>
-        <groupId>org.apache.plc4x</groupId>
-        <version>0.13.0-SNAPSHOT</version>
-    </parent>
+    <artifactId>merlot</artifactId>
+    <groupId>org.apache.plc4x</groupId>
+    <version>0.13.0-SNAPSHOT</version>
+  </parent>
 
-    <groupId>org.apache.plc4x.merlot.drv.simulated</groupId>
-    <artifactId>org.apache.plc4x.merlot.drv.simulated</artifactId>
+    <groupId>org.apache.plc4x.merlot.drv.mb</groupId>
+    <artifactId>org.apache.plc4x.merlot.drv.mb</artifactId>
     <version>0.13.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
-    <name>PLC4J: Merlot :: sim :: Simulated driver</name>
-    <description>org.apache.plc4x.merlot.drv.simulated OSGi blueprint bundle project.</description>
+    <name>PLC4J: Merlot :: mb :: Support for Plc4x Modbus driver</name>
+    <description>org.apache.plc4x.merlot.drv.mb OSGi blueprint bundle project.</description>
 
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>5.1.8</version>
+                <version>5.1.9</version>
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Version>0.13.0-SNAPSHOT</Bundle-Version>
-                        <Export-Package>org.apache.plc4x.merlot.drv.simulated*;version=0.13.0-SNAPSHOT</Export-Package>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Export-Package>org.apache.plc4x.merlot.drv.mb*;version=${project.version}</Export-Package>
                         <Import-Package>*</Import-Package>
                     </instructions>
                 </configuration>
@@ -63,13 +63,8 @@
     </build>
     <dependencies>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>${slf4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x.merlot.das.base</groupId>
-            <artifactId>org.apache.plc4x.merlot.das.base</artifactId>
+            <groupId>org.apache.plc4x.merlot.api</groupId>
+            <artifactId>org.apache.plc4x.merlot.api</artifactId>
             <version>0.13.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyService.java
new file mode 100644
index 0000000..bc40aa6
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyService.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.mb.api;
+
+public interface MyService {
+    
+    public String echo(String message);
+    
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyServiceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyServiceImpl.java
new file mode 100644
index 0000000..a71cef1
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/api/MyServiceImpl.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.mb.api;
+
+public class MyServiceImpl implements MyService {
+    
+    public String echo(String message) {
+        return "Echo processed: " + message;
+    }
+    
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/impl/ModbusPlcTagFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/impl/ModbusPlcTagFunctionImpl.java
new file mode 100644
index 0000000..0f7a0d1
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/java/org/apache/plc4x/merlot/drv/mb/impl/ModbusPlcTagFunctionImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.mb.impl;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
+import org.osgi.service.dal.OperationMetadata;
+import org.osgi.service.dal.PropertyMetadata;
+
+
+public class ModbusPlcTagFunctionImpl implements PlcTagFunction {
+
+    @Override
+    public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf) {
+        throw new UnsupportedOperationException("Not supported yet."); 
+    }
+
+    @Override
+    public PropertyMetadata getPropertyMetadata(String propertyName) {
+        throw new UnsupportedOperationException("Not supported yet."); 
+    }
+
+    @Override
+    public OperationMetadata getOperationMetadata(String operationName) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Object getServiceProperty(String propKey) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String[] getServicePropertyKeys() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/resources/OSGI-INF/blueprint/my-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/resources/OSGI-INF/blueprint/my-service.xml
new file mode 100644
index 0000000..1150d95
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.mb/src/main/resources/OSGI-INF/blueprint/my-service.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <bean id="serviceBean" class="org.apache.plc4x.merlot.drv.mb.MyServiceImpl"/>
+
+    <service ref="serviceBean" interface="org.apache.plc4x.merlot.drv.mb.MyService"/>
+
+</blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
similarity index 72%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
index dd7f1ce..db2ea47 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
@@ -21,31 +21,31 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <artifactId>merlot</artifactId>
-        <groupId>org.apache.plc4x</groupId>
-        <version>0.13.0-SNAPSHOT</version>
-    </parent>
+    <artifactId>merlot</artifactId>
+    <groupId>org.apache.plc4x</groupId>
+    <version>0.13.0-SNAPSHOT</version>
+  </parent>
 
-    <groupId>org.apache.plc4x.merlot.drv.simulated</groupId>
-    <artifactId>org.apache.plc4x.merlot.drv.simulated</artifactId>
+    <groupId>org.apache.plc4x.merlot.drv.s7</groupId>
+    <artifactId>org.apache.plc4x.merlot.drv.s7</artifactId>
     <version>0.13.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
-    <name>PLC4J: Merlot :: sim :: Simulated driver</name>
-    <description>org.apache.plc4x.merlot.drv.simulated OSGi blueprint bundle project.</description>
+    <name>PLC4J: Merlot :: s7 :: Support for Plc4x S7 driver</name>
+    <description>org.apache.plc4x.merlot.drv.s7 OSGi blueprint bundle project.</description>
 
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>5.1.8</version>
+                <version>5.1.9</version>
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Version>0.13.0-SNAPSHOT</Bundle-Version>
-                        <Export-Package>org.apache.plc4x.merlot.drv.simulated*;version=0.13.0-SNAPSHOT</Export-Package>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Export-Package>org.apache.plc4x.merlot.drv.s7*;version=${project.version}</Export-Package>
                         <Import-Package>*</Import-Package>
                     </instructions>
                 </configuration>
@@ -63,13 +63,8 @@
     </build>
     <dependencies>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>${slf4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x.merlot.das.base</groupId>
-            <artifactId>org.apache.plc4x.merlot.das.base</artifactId>
+            <groupId>org.apache.plc4x.merlot.api</groupId>
+            <artifactId>org.apache.plc4x.merlot.api</artifactId>
             <version>0.13.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyService.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyService.java
new file mode 100644
index 0000000..29e4369
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyService.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.api;
+
+public interface MyService {
+    
+    public String echo(String message);
+    
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyServiceImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyServiceImpl.java
new file mode 100644
index 0000000..18b15da
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/api/MyServiceImpl.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.api;
+
+public class MyServiceImpl implements MyService {
+    
+    public String echo(String message) {
+        return "Echo processed: " + message;
+    }
+    
+}
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
new file mode 100644
index 0000000..af38649
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/impl/S7PlcTagFunctionImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.impl;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
+import org.osgi.service.dal.OperationMetadata;
+import org.osgi.service.dal.PropertyMetadata;
+
+
+public class S7PlcTagFunctionImpl implements PlcTagFunction {
+
+    @Override
+    public ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf) {
+        throw new UnsupportedOperationException("Not supported yet."); 
+    }
+
+    @Override
+    public PropertyMetadata getPropertyMetadata(String propertyName) {
+        throw new UnsupportedOperationException("Not supported yet."); 
+    }
+
+    @Override
+    public OperationMetadata getOperationMetadata(String operationName) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Object getServiceProperty(String propKey) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String[] getServicePropertyKeys() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-service.xml
similarity index 52%
copy from plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
copy to plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-service.xml
index 89db26d..d3ef1f6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/resources/OSGI-INF/blueprint/s7-service.xml
@@ -15,33 +15,29 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="eager">
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-<!--    <bean id="serviceBean" class="org.apache.plc4x.merlot.drv.simulated.MyServiceImpl"/>
-
-    <service ref="serviceBean" interface="org.apache.plc4x.merlot.drv.simulated.MyService"/>-->
-    
-    <reference id="serviceEventAdmin"
-        interface="org.osgi.service.event.EventAdmin">
-    </reference>    
-    
-    <bean id="SimRefDrvImpl" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedReferringDriverImpl" scope="singleton">
-        <argument ref="blueprintBundleContext"/>
-        <argument ref="serviceEventAdmin"/>        
-    </bean>  
-        
-    <reference id="servicePLC4XSimulated"
+    <reference id="S7Plc4xDriverRef"
         interface="org.apache.plc4x.java.api.PlcDriver"
-        filter="(org.apache.plc4x.driver.code=simulated)" 
+        filter="(org.apache.plc4x.driver.code=s7)" 
         timeout="10000"
         availability="mandatory">
-        <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />
-    </reference>    
+<!--        <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />-->
+    </reference>       
     
-    <service  ranking="0" ref="SimRefDrvImpl" interface="org.osgi.service.device.Driver">
+    
+    <bean id="S7PlcTagFunctionBean" class="org.apache.plc4x.merlot.drv.s7.impl.S7PlcTagFunctionImpl" scope="singleton">
+        <argument ref="blueprintBundleContext"/>             
+    </bean>
+
+    <service  ranking="0" ref="S7PlcTagFunctionBean" interface="org.osgi.service.device.Driver">
         <service-properties>
-            <entry key="DRIVER_ID" value="org.apache.plc4x.simulated"/>
+            <entry key="dal.function.UID"         value="org.apache.plc4x.s7"/>
+            <entry key="dal.function.device.UID"  value="s7"/>      
+            <entry key="dal.function.description" value="Generated write tag for s7driver."/>                                  
+            <entry key="dal.function.version"     value="org.apache.plc4x.s7"/>   
+            <entry key="dal.function.type"        value=""/>                      
         </service-properties>
-    </service>    
+    </service> 
 
 </blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
index dd7f1ce..dbd1d7e 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/pom.xml
@@ -31,7 +31,7 @@
     <version>0.13.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
-    <name>PLC4J: Merlot :: sim :: Simulated driver</name>
+    <name>PLC4J: Merlot :: sim :: Support for Plc4x Simulated driver</name>
     <description>org.apache.plc4x.merlot.drv.simulated OSGi blueprint bundle project.</description>
 
     <build>
@@ -47,6 +47,7 @@
                         <Bundle-Version>0.13.0-SNAPSHOT</Bundle-Version>
                         <Export-Package>org.apache.plc4x.merlot.drv.simulated*;version=0.13.0-SNAPSHOT</Export-Package>
                         <Import-Package>*</Import-Package>
+                        <_removeheaders>Import-Service,Export-Service</_removeheaders>                            
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/java/org/apache/plc4x/merlot/drv/simulated/impl/SimulatedPlcTagFunctionImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/java/org/apache/plc4x/merlot/drv/simulated/impl/SimulatedPlcTagFunctionImpl.java
new file mode 100644
index 0000000..eff3e7a
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/java/org/apache/plc4x/merlot/drv/simulated/impl/SimulatedPlcTagFunctionImpl.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.drv.simulated.impl;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.model.PlcTag;
+import static org.apache.plc4x.java.api.types.PlcValueType.BOOL;
+import static org.apache.plc4x.java.api.types.PlcValueType.BYTE;
+import org.apache.plc4x.java.simulated.tag.SimulatedTag;
+import org.apache.plc4x.merlot.api.PlcTagFunction;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.dal.OperationMetadata;
+import org.osgi.service.dal.PropertyMetadata;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class SimulatedPlcTagFunctionImpl implements PlcTagFunction {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimulatedPlcTagFunctionImpl.class);
+    private BundleContext bc;   
+    
+    public SimulatedPlcTagFunctionImpl(BundleContext bc) {
+        this.bc = bc;
+    }    
+        
+    /*
+    *
+    */
+    @Override
+    public  ImmutablePair<String, Object[]> getStringTag(PlcTag plcTag, ByteBuf byteBuf) {
+        LOGGER.info("PlcTag class {} and type {} ", plcTag.getClass(),  plcTag.getPlcValueType());
+        short tempValue = 0;
+        if (plcTag instanceof SimulatedTag){
+            final SimulatedTag simTag = (SimulatedTag) plcTag;
+            LOGGER.info("Processing SimulatedTag: {}", simTag.toString());
+            Object[] objValues = new Object[byteBuf.capacity()];
+            StringBuilder strTagBuilder = new StringBuilder();             
+            switch (simTag.getPlcValueType()) { 
+                case BOOL:
+                    strTagBuilder.append("STDOUT/").
+                            append("merlot").
+                            append(":BOOL[").
+                            append(byteBuf.capacity()).
+                            append("]");
+                    byteBuf.resetReaderIndex();
+                    for (int i=0; i < byteBuf.capacity(); i++){
+                        objValues[i] = byteBuf.readBoolean();
+                    }
+                    break;
+                case BYTE:
+                    strTagBuilder.append("STDOUT/").
+                            append("merlot").
+                            append(":BYTE[").
+                            append(byteBuf.capacity()).
+                            append("]");
+                    byteBuf.resetReaderIndex();
+                    for (int i=0; i < byteBuf.capacity(); i++){
+                        tempValue = (short) (byteBuf.readByte() & 0xFF);
+                        objValues[i] = tempValue;
+                    }                   
+                    break;
+                default:;                                    
+            }
+            LOGGER.info("Writing tag : {}",strTagBuilder.toString() );
+            return new ImmutablePair<>(strTagBuilder.toString(), objValues);
+        }
+        return null; 
+    }    
+    
+    @Override
+    public PropertyMetadata getPropertyMetadata(String propertyName) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public OperationMetadata getOperationMetadata(String operationName) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Object getServiceProperty(String propKey) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String[] getServicePropertyKeys() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+
+
+
+    
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
index 89db26d..6cfb9e2 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.simulated/src/main/resources/OSGI-INF/blueprint/simulated-drv-service.xml
@@ -25,23 +25,37 @@
         interface="org.osgi.service.event.EventAdmin">
     </reference>    
     
-    <bean id="SimRefDrvImpl" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedReferringDriverImpl" scope="singleton">
+<!--    <bean id="SimRefDrvImpl" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedReferringDriverImpl" scope="singleton">
         <argument ref="blueprintBundleContext"/>
         <argument ref="serviceEventAdmin"/>        
-    </bean>  
+    </bean>  -->
+    
+    <bean id="SimPlcTagFunction" class="org.apache.plc4x.merlot.drv.simulated.impl.SimulatedPlcTagFunctionImpl" scope="singleton">
+        <argument ref="blueprintBundleContext"/>      
+    </bean>      
         
     <reference id="servicePLC4XSimulated"
         interface="org.apache.plc4x.java.api.PlcDriver"
         filter="(org.apache.plc4x.driver.code=simulated)" 
         timeout="10000"
         availability="mandatory">
-        <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />
+<!--        <reference-listener bind-method="bind" unbind-method="unbind" ref="SimRefDrvImpl" />-->
     </reference>    
     
-    <service  ranking="0" ref="SimRefDrvImpl" interface="org.osgi.service.device.Driver">
+<!--    <service  ranking="0" ref="SimRefDrvImpl" interface="org.osgi.service.device.Driver">
         <service-properties>
             <entry key="DRIVER_ID" value="org.apache.plc4x.simulated"/>
         </service-properties>
-    </service>    
+    </service>   -->
+    
+    <service  ranking="0" ref="SimPlcTagFunction" auto-export="interfaces">
+        <service-properties>
+            <entry key="dal.function.UID"         value="org.apache.plc4x.simulated"/>
+            <entry key="dal.function.device.UID"  value="simulated"/>      
+            <entry key="dal.function.description" value="Generated write tag for simulated driver."/>                                  
+            <entry key="dal.function.version"     value="org.apache.plc4x.simulated"/>   
+            <entry key="dal.function.type"        value=""/>                      
+        </service-properties>
+    </service> 
 
 </blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml
index 2106da1..2a3a3f3 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.features/src/main/feature/feature.xml
@@ -93,7 +93,10 @@
         <bundle start-level="30">mvn:org.apache.plc4x/plc4j-utils-raw-sockets/${project.version}</bundle>  
         
         <!-- Plc4x - Default driver implementation -->        
-        <bundle start-level="32">mvn:org.apache.plc4x/plc4j-driver-simulated/${project.version}</bundle>                         
+        <bundle start-level="32">mvn:org.apache.plc4x/plc4j-driver-simulated/${project.version}</bundle> 
+        
+        <!-- Plc4x - Support services for Plc4x driver implementation -->          
+        <bundle start-level="32">mvn:org.apache.plc4x.merlot.drv.simulated/org.apache.plc4x.merlot.drv.simulated/${project.version}</bundle>                                 
                         
         <!-- Plc4x-Merlot-Core> 
             1. Driver packages must have a "start-level" greater than 40.
diff --git a/plc4j/tools/merlot/pom.xml b/plc4j/tools/merlot/pom.xml
index 42fdd9b..6fac475 100644
--- a/plc4j/tools/merlot/pom.xml
+++ b/plc4j/tools/merlot/pom.xml
@@ -17,123 +17,322 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-        
+            
+  
+  
   
   <modelVersion>4.0.0</modelVersion>
-      
+          
 
   
+  
+  
   <!--    <parent>
         <groupId>org.apache.plc4x</groupId>
         <artifactId>plc4j-integrations</artifactId>
         <version>0.13.0-SNAPSHOT</version>
     </parent>-->
-        
+            
+  
+  
   
   <groupId>org.apache.plc4x</groupId>
+      
+  
   <artifactId>merlot</artifactId>
+      
+  
   <version>0.13.0-SNAPSHOT</version>
+      
+  
   
   <packaging>pom</packaging>
-        
-  <name>PLC4J: Integrations: Apache Karaf</name>  
+            
+  
+  
+  <name>PLC4J: Integrations: Apache Karaf</name>
+      
+  
+  
   <description>Integration module for integrating PLC4X into Apache Karaf.</description>
-        
+            
+  
+  
   
   <properties>
-      
+              
+    
+    
     <!-- Inherited -->
-     
+             
+    
+    
     <plc4x.version>0.13.0-SNAPSHOT</plc4x.version>
+            
+    
     <apache.log4j.version>2.20.0</apache.log4j.version>
+            
+    
     <bit-io.version>1.4.3</bit-io.version>
+            
+    
     <c3p0.version>0.9.5.5</c3p0.version>
+            
+    
     <commons-codec.version>1.17.1</commons-codec.version>
+            
+    
     <commons-net.version>3.11.1</commons-net.version>
+            
+    
     <commons-lang3.version>3.16.0</commons-lang3.version>
+            
+    
     <hikaricp.version>2.7.9</hikaricp.version>
+            
+    
     <netty.version>4.1.104.Final</netty.version>
+            
+    
     <quartz.version>2.3.2</quartz.version>
+            
+    
     <slf4j.version>2.0.3</slf4j.version>
+            
+    
     <spifly.version>1.3.6</spifly.version>
+            
+    
     <jackson.version>2.16.1</jackson.version>
+            
+    
     <jakarta.xml.bind.version>2.3.3</jakarta.xml.bind.version>
+            
+    
     <parser-ng.version>0.1.8</parser-ng.version>
+            
+    
     <vavr.version>0.10.4</vavr.version>
+            
+    
     <logback.version>1.5.3</logback.version>
-    <aries.spifly.version>1.3.7</aries.spifly.version>      
-    <asm.version>9.6</asm.version>
             
+    
+    <aries.spifly.version>1.3.7</aries.spifly.version>
+              
+    
+    
+    <asm.version>9.6</asm.version>
+                    
+    
+    
     <!-- Database used in Pax-jdbc -->
+            
+    
     <derby.version>10.14.2.0</derby.version>
+            
+    
     <h2.version>2.1.210</h2.version>
-
+            
+    
     <!-- Remove GPL licence -->
+            
+    
     <javaluator.version>3.0.3</javaluator.version>
-                   
+                           
+    
+    
     <!-- Integration version -->
+            
+    
     <karaf.version>4.4.6</karaf.version>
-    <decanter.version>2.10.0</decanter.version>                
+            
+    
+    <decanter.version>2.10.0</decanter.version>
+                        
+    
+    
     <org.osgi.core.version>6.0.0</org.osgi.core.version>
+            
+    
     <osgi.core.version>8.0.0</osgi.core.version>
+            
+    
     <osgi.cmpn.version>7.0.0</osgi.cmpn.version>
+            
+    
     <osgi.device.version>1.1.0</osgi.device.version>
+            
+    
     <org.osgi.dal.version>1.0.2</org.osgi.dal.version>
+            
+    
     <disruptor.version>4.0.0</disruptor.version>
+            
+    
     
     <!-- EPICS -->
+            
+    
     <epics.core.version>7.0.9</epics.core.version>
+            
+    
     <epics.util.version>1.0.6</epics.util.version>
+            
+    
     <epics.vtype.version>1.0.6</epics.vtype.version>
+            
+    
     <epics.vtype.all.version>1.0.6</epics.vtype.all.version>
+            
+    
     <epics.ntypes.version>0.3.8</epics.ntypes.version>
+            
+    
     <epics.jca.version>2.4.8</epics.jca.version>
+            
+    
     <epics.pvaccess.version>5.1.8</epics.pvaccess.version>
+            
+    
     <epics.pvaclient.version>4.3.2</epics.pvaclient.version>
+            
+    
     <epics.pvdata.version>6.1.8</epics.pvdata.version>
+            
+    
     <epics.pvdatabase.version>4.3.1</epics.pvdatabase.version>
+            
+    
     <epics.gpclient.version>1.0.7</epics.gpclient.version>
+            
+    
     <epics.gpclient.core.version>1.0.7</epics.gpclient.core.version>
+            
+    
     <epics.gpclient.sim.version>1.0.7</epics.gpclient.sim.version>
+            
+    
     <epics.gpclient.loc.version>1.0.7</epics.gpclient.loc.version>
+            
+    
     <epics.gpclient.pva.version>1.0.7</epics.gpclient.pva.version>
+            
+    
     <epics.gpclient.ca.version>1.0.7</epics.gpclient.ca.version>
+            
+    
     
     <!-- GRPC Service -->
+            
+    
     <protobuf.version>3.25.3</protobuf.version>
+            
+    
     <proto.google.commons.version>2.29.0</proto.google.commons.version>
+            
+    
     <grpc.version>1.62.2</grpc.version>
+            
+    
     <guava.android.version>32.1.3-android</guava.android.version>
+            
+    
     <errorprone.version>2.23.0</errorprone.version>
+            
+    
     <annotations.api.version>6.0.53</annotations.api.version>
+            
+    
     <failureaccess.version>1.0.1</failureaccess.version>
+            
+    
     <j2objc.version>2.8</j2objc.version>
+            
+    
     <jsr305.version>3.0.2</jsr305.version>
+            
+    
     <okio.version>3.9.0</okio.version>
+            
+    
     <tomcat.annotation.version>6.0.53</tomcat.annotation.version>
+            
+    
     <annotation.version>13.0</annotation.version>
+            
+    
     <kotlin.version>1.9.21</kotlin.version>
+          
+  
   </properties>
-
+      
+  
   <modules>
+            
+    
     <module>org.apache.plc4x.merlot.modbus.dev</module>
+            
+    
     <module>org.apache.plc4x.merlot.modbus.svr</module>
+            
+    
     <module>org.apache.plc4x.merlot.scheduler</module>
+            
+    
     <module>org.apache.plc4x.merlot.branding</module>
+            
+    
     <module>org.apache.plc4x.merlot.uns</module>
+            
+    
     <module>org.apache.plc4x.merlot.features</module>
+            
+    
     <module>org.apache.plc4x.merlot.das</module>
+            
+    
     <module>org.apache.plc4x.merlot.modbus.sim</module>
+            
+    
     <module>org.apache.plc4x.merlot.db</module>
+            
+    
     <module>org.apache.plc4x.merlot.das.api</module>
+            
+    
     <module>org.apache.plc4x.merlot.derby</module>
+            
+    
     <module>org.apache.plc4x.merlot.h2</module>
+            
+    
     <module>org.apache.plc4x.merlot.drv.simulated</module>
+            
+    
     <module>org.apache.plc4x.merlot.das.ref</module>
+            
+    
     <module>org.apache.plc4x.merlot.das.base</module>
-    <module>org.apache.plc4x.merlot.grpc</module>          
+            
+    
+    <module>org.apache.plc4x.merlot.grpc</module>
+                  
+    
+    
     <module>org.apache.plc4x.merlot.ui</module>
-    <module>org.apache.plc4x.merlot</module>    
+            
+    
+    <module>org.apache.plc4x.merlot</module>
+            
+    
+    
+    <module>org.apache.plc4x.merlot.drv.s7</module>
+          
+    
+    <module>org.apache.plc4x.merlot.drv.mb</module>
+      
   </modules>
+    
 
 </project>