diff --git a/timeseriesviewer/timeseries.py b/timeseriesviewer/timeseries.py
index 3e8ce2e95b94c14a5c4840c90a144fc09f74d1a3..b40664aeb7dafb82a5eda2f3a3ce755c830e81e9 100644
--- a/timeseriesviewer/timeseries.py
+++ b/timeseriesviewer/timeseries.py
@@ -336,11 +336,40 @@ class TimeSeriesTableView(QTableView):
     def contextMenuEvent(self, event):
 
         menu = QMenu(self)
-        menu.addAction('Check selected observation')
-        menu.addAction('Uncheck selected observation')
-
+        a = menu.addAction('Copy value(s)')
+        a.triggered.connect(self.onCopyValues)
+        a = menu.addAction('Check')
+        a.triggered.connect(lambda : self.onSetCheckState(Qt.Checked))
+        a = menu.addAction('Uncheck')
+        a.triggered.connect(lambda: self.onSetCheckState(Qt.Unchecked))
         menu.popup(QCursor.pos())
 
+    def onSetCheckState(self, checkState):
+        indices = self.selectionModel().selectedIndexes()
+        rows = sorted(list(set([i.row() for i in indices])))
+        model = self.model()
+        if isinstance(model, TimeSeriesTableModel):
+            for r in rows:
+                idx = model.index(r,0)
+                model.setData(idx, checkState, Qt.CheckStateRole)
+
+    def onCopyValues(self):
+        indices = self.selectionModel().selectedIndexes()
+        model = self.model()
+        if isinstance(model, TimeSeriesTableModel):
+            from collections import OrderedDict
+            R = OrderedDict()
+            for idx in indices:
+                if not idx.row() in R.keys():
+                    R[idx.row()] = []
+                R[idx.row()].append(model.data(idx, Qt.DisplayRole))
+            info = []
+            for k, values in R.items():
+                info.append(';'.join([str(v) for v in values]))
+            info = '\n'.join(info)
+            QApplication.clipboard().setText(info)
+        s = ""
+
     def selectSelectedObservations(b):
         assert isinstance(b, bool)