Index: trunk/FACT++/src/RemoteControl.cc
===================================================================
--- trunk/FACT++/src/RemoteControl.cc	(revision 10340)
+++ trunk/FACT++/src/RemoteControl.cc	(revision 10341)
@@ -72,10 +72,23 @@
     if (fCurrentServer.empty())
     {
-        if(fServiceList.HasServer(str))
+        const size_t p1 = str.find_first_of(' ');
+        const size_t p2 = str.find_first_of('/');
+
+        string s = str;
+        if (p2!=string::npos && p1>p2)
+            s = str.substr(0, p2);
+
+        if (p2<p1)
         {
-            fCurrentServer = str;
+            const string c = str.substr(p2+1);
+            return !fCommandList.SendDimCommand(lout, s, c);
+        }
+
+        if(fServiceList.HasServer(s))
+        {
+            fCurrentServer = s;
             return false;
         }
-        lout << kRed << "Unkown server '" << str << "'" << endl;
+        lout << kRed << "Unkown server '" << s << "'" << endl;
         return true;
     }
Index: trunk/FACT++/src/RemoteControl.h
===================================================================
--- trunk/FACT++/src/RemoteControl.h	(revision 10340)
+++ trunk/FACT++/src/RemoteControl.h	(revision 10341)
@@ -104,4 +104,5 @@
 #include "WindowLog.h"
 #include "ReadlineColor.h"
+#include "tools.h"
 
 template <class T>
@@ -110,4 +111,9 @@
 private:
     std::ostream &lout; /// Output stream for local synchrounous output
+
+    static void append(std::string &str)
+    {
+        str.append("/");
+    }
 
     // This funtion defines which generator should be called.
@@ -117,10 +123,21 @@
     {
         // Get the whole buffer before the tab-position
-        const string s = string(T::GetBuffer(), 0, start);
-        const string l = T::TrimSpaces(s.c_str());
+        const string b = string(T::GetBuffer());
+        const string s = b.substr(0, start);
+        const string l = Trim(s.c_str());
         if (l.empty())
         {
             if (fCurrentServer.empty())
-                return T::Complete(fCommandList.GetServerList(), text);
+            {
+                const size_t p1 = b.find_first_of(' ');
+                const size_t p2 = b.find_first_of('/');
+
+                if (p1==string::npos && p2!=string::npos)
+                    return T::Complete(fCommandList.GetServiceList(), text);
+
+                std::vector<std::string> v = fCommandList.GetServerList();
+                for_each(v.begin(), v.end(), RemoteControl::append);
+                return T::Complete(v, text);
+            }
             else
                 return T::Complete(fCommandList.GetServiceList(fCurrentServer), text);
@@ -152,4 +169,5 @@
         T::PrintGeneralHelp();
         lout << " " << kUnderline << "Specific commands:" << endl;
+        lout << kBold << "   h,help <arg> " << kReset << "List help text for given server or command." << endl;
         lout << kBold << "   s,servers    " << kReset << "List all servers which are connected." << endl;
         lout << kBold << "   svc,services " << kReset << "List all services in the network." << endl;
@@ -168,4 +186,28 @@
     bool Process(const std::string &str)
     {
+        if (str.substr(0, 2)=="h " || str.substr(0, 5)=="help ")
+        {
+            const size_t p1 = str.find_first_of(' ');
+            const string svc = str.substr(p1+1);
+
+            const size_t p3 = svc.find_first_of('/');
+            const string s = svc.substr(0, p3);
+            const string c = p3==string::npos?"":svc.substr(p3+1);
+
+            lout << endl;
+            if (!fCurrentServer.empty())
+            {
+                if (fCommandList.PrintDescription(lout, fCurrentServer, svc)==0)
+                    lout << "   " << svc << ": <not found>" << endl;
+            }
+            else
+            {
+                if (fCommandList.PrintDescription(lout, s, c)==0)
+                    lout << "   <no matches found>" <<endl;
+            }
+
+            return true;
+        }
+
         if (ReadlineColor::Process(lout, str))
             return true;
