public void run() {
			try {
				while (!exit) {
                    List<OffsetItem> offsetItemGroup = new ArrayList<>();
                    // iterate monitor offsets
                    for (OffsetIdent monitorOffsetIdent : monitorOffsetList.values()) {
                        if (exit) {
                            break;
                        }
                        //
                        int mOffset = monitorOffsetIdent.getOffset();
                        final OffsetItem newOffsetItem = fsuipcFlightSimInterface.read(new OffsetIdent(mOffset, monitorOffsetIdent.getSize()));
                        // determine old offset value
                        ByteArray oldOffsetValue = null;
                        if (offsetValues.containsKey(mOffset)) {
                            oldOffsetValue = offsetValues.get(mOffset);
                        }
                        // send new offset value
                        if (!newOffsetItem.getValue().equals(oldOffsetValue)) {
                            offsetItemGroup.add(newOffsetItem);
                            offsetEventListeners.fire().valueChanged(newOffsetItem);
                        }
                        // save new offset value
                        if (offsetValues.containsKey(mOffset)) {
                            offsetValues.remove(mOffset);
                        }
                        offsetValues.put(mOffset, newOffsetItem.getValue());
                    }
                    //
                    if(offsetItemGroup.size() > 0) {
                        offsetCollectionEventListeners.fire().valuesChanged(offsetItemGroup);
                    }
                    // ~
					Thread.sleep(0, 1);
				}
			} catch (InterruptedException e) {
				log.error(e.getMessage(), e);
			}
		}