diff --git a/src/osmo_gsm_tester/obj/run_node.py b/src/osmo_gsm_tester/obj/run_node.py
new file mode 100644
index 0000000..e9f43a1
--- /dev/null
+++ b/src/osmo_gsm_tester/obj/run_node.py
@@ -0,0 +1,69 @@
+# osmo_gsm_tester: run_node: object holding information on a target env to run stuff.
+#
+# Copyright (C) 2020 by sysmocom - s.f.m.c. GmbH
+#
+# Author: Pau Espin Pedrol <pespin@sysmocom.de>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from ..core import log
+
+class RunNode(log.Origin):
+
+    T_LOCAL = 'local'
+    T_REM_SSH = 'ssh'
+
+    def __init__(self, type=None, run_addr=None, ssh_user=None, ssh_addr=None):
+        super().__init__(log.C_RUN, 'runnode')
+        self._type = type
+        self._run_addr = run_addr
+        self._ssh_user = ssh_user
+        self._ssh_addr = ssh_addr
+        if not self._type:
+            raise log.Error('run_type not set')
+        if not self._run_addr:
+            raise log.Error('run_addr not set')
+        if self._type == RunNode.T_LOCAL and (self._ssh_user or self._ssh_addr):
+            raise log.Error('run_type=%s but ssh info set' % RunNode.T_LOCAL)
+        if self._type == RunNode.T_REM_SSH and not (self._ssh_user and self._ssh_addr):
+            raise log.Error('run_type=%s but ssh info NOT set' % RunNode.T_LOCAL)
+
+        if self._type == RunNode.T_LOCAL:
+            self.set_name('run-' + self._run_addr)
+        else:
+            self.set_name('run-' + self._run_addr + "(" + self._ssh_user + '@' + self._ssh_addr + ")")
+
+    @classmethod
+    def from_conf(cls, conf):
+        return cls(conf.get('run_type', None), conf.get('run_addr', None), conf.get('ssh_user', None), conf.get('ssh_addr', None))
+
+    def is_local(self):
+        return self._type == RunNode.T_LOCAL
+
+    def __str__(self):
+        return self.name()
+
+    def run_type(self):
+        return self._type
+
+    def run_addr(self):
+        return self._run_addr
+
+    def ssh_user(self):
+        return self._ssh_user
+
+    def ssh_addr(self):
+        return self._ssh_addr
+
+# vim: expandtab tabstop=4 shiftwidth=4
