diff --git a/src/sbbs3/ctrl/MainFormUnit.cpp b/src/sbbs3/ctrl/MainFormUnit.cpp
index b07783f7ac62c851004cb6cdfb18cbe3d54ab6d1..95378c5f4c7c0152e80ce1b9a123e4f2264a9e3f 100644
--- a/src/sbbs3/ctrl/MainFormUnit.cpp
+++ b/src/sbbs3/ctrl/MainFormUnit.cpp
@@ -532,6 +532,7 @@ __fastcall TMainForm::TMainForm(TComponent* Owner)
     SpyTerminalFont->Pitch=fpFixed;
     SpyTerminalWidth=434;
     SpyTerminalHeight=364;
+    SpyTerminalKeyboardActive=true;
 }
 //---------------------------------------------------------------------------
 void __fastcall TMainForm::FileExitMenuItemClick(TObject *Sender)
@@ -576,6 +577,9 @@ void __fastcall TMainForm::FormCreate(TObject *Sender)
 	   	SpyTerminalFont->Name=Registry->ReadString("SpyTerminalFontName");
    	if(Registry->ValueExists("SpyTerminalFontSize"))
 	   	SpyTerminalFont->Size=Registry->ReadInteger("SpyTerminalFontSize");
+   	if(Registry->ValueExists("SpyTerminalKeyboardActive"))
+	   	SpyTerminalKeyboardActive
+            =Registry->ReadBool("SpyTerminalKeyboardActive");
 
     Registry->CloseKey();
     delete Registry;
@@ -734,11 +738,17 @@ void __fastcall TMainForm::SaveSettings(void)
     	,AnsiString(ftp_startup.index_file_name));
     Registry->WriteInteger("FtpOptions",ftp_startup.options);
 
-	Registry->WriteInteger("SpyTerminalWidth",SpyTerminalWidth);
-	Registry->WriteInteger("SpyTerminalHeight",SpyTerminalHeight);
-   	Registry->WriteString("SpyTerminalFontName",SpyTerminalFont->Name);
-	Registry->WriteInteger("SpyTerminalFontSize",SpyTerminalFont->Size);
-    
+	Registry->WriteInteger( "SpyTerminalWidth"
+                            ,SpyTerminalWidth);
+	Registry->WriteInteger( "SpyTerminalHeight"
+                            ,SpyTerminalHeight);
+   	Registry->WriteString(  "SpyTerminalFontName"
+                            ,SpyTerminalFont->Name);
+	Registry->WriteInteger( "SpyTerminalFontSize"
+                            ,SpyTerminalFont->Size);
+	Registry->WriteBool(    "SpyTerminalKeyboardActive"
+                            ,SpyTerminalKeyboardActive);
+
     Registry->CloseKey();
     delete Registry;
 
diff --git a/src/sbbs3/ctrl/MainFormUnit.h b/src/sbbs3/ctrl/MainFormUnit.h
index ccb155560b366a58af9eb94618bba9e9615a558c..e6650c4113092effe9b84e9df7001ec7e3a85ec8 100644
--- a/src/sbbs3/ctrl/MainFormUnit.h
+++ b/src/sbbs3/ctrl/MainFormUnit.h
@@ -239,6 +239,7 @@ public:		// User declarations
     int             SpyTerminalWidth;
     int             SpyTerminalHeight;
     TFont*          SpyTerminalFont;
+    bool            SpyTerminalKeyboardActive;
 	TPageControl* __fastcall PageControl(int num);
 	int __fastcall  PageNum(TPageControl* obj);
     void __fastcall SaveSettings(void);
diff --git a/src/sbbs3/ctrl/NodeFormUnit.cpp b/src/sbbs3/ctrl/NodeFormUnit.cpp
index 46cbef6731a5ba0f6aa8da9c7e7d2f1bf4a4ecdc..a0567e7d4310305e1a7c65e7f12f6be54daf0661 100644
--- a/src/sbbs3/ctrl/NodeFormUnit.cpp
+++ b/src/sbbs3/ctrl/NodeFormUnit.cpp
@@ -57,7 +57,7 @@ __fastcall TNodeForm::TNodeForm(TComponent* Owner)
 {
 //    OutputDebugString("NodeForm constructor\n");
 	MainForm=(TMainForm*)Application->MainForm;
-    MainForm->bbs_startup.spybuf
+    MainForm->bbs_startup.node_spybuf
         =(RingBuf**)calloc(1,sizeof(RingBuf*)*MAX_NODES);
 }
 //---------------------------------------------------------------------------
@@ -470,8 +470,9 @@ void __fastcall TNodeForm::SpyButtonClick(TObject *Sender)
     	if(ListBox->Selected[i]==true) {
             if(SpyForms[i]==NULL) {
                 Application->CreateForm(__classid(TSpyForm), &SpyForms[i]);
-                SpyForms[i]->spybuf=&MainForm->bbs_startup.spybuf[i];
-                SpyForms[i]->Caption="Spying on Node "+AnsiString(i+1);
+                SpyForms[i]->inbuf=&MainForm->bbs_startup.node_inbuf[i];
+                SpyForms[i]->outbuf=&MainForm->bbs_startup.node_spybuf[i];
+                SpyForms[i]->Caption="Node "+AnsiString(i+1);
             }
             SpyForms[i]->Show();
         }
diff --git a/src/sbbs3/ctrl/SpyFormUnit.cpp b/src/sbbs3/ctrl/SpyFormUnit.cpp
index 771b4787f0fd1fe5e0f0cc88597325e998830cd1..dbedb892318b6f2158e412333282630971b5af10 100644
--- a/src/sbbs3/ctrl/SpyFormUnit.cpp
+++ b/src/sbbs3/ctrl/SpyFormUnit.cpp
@@ -19,9 +19,12 @@ __fastcall TSpyForm::TSpyForm(TComponent* Owner)
 {
     Width=MainForm->SpyTerminalWidth;
     Height=MainForm->SpyTerminalHeight;
+    KeyboardActive->Checked=MainForm->SpyTerminalKeyboardActive;
     Terminal = new TEmulVT(this);
     Terminal->Parent=this;
     Terminal->Align=alClient;
+    Terminal->OnKeyPress=FormKeyPress;
+    Terminal->OnMouseUp=FormMouseUp;
 }
 bool strip_ansi(char* str)
 {
@@ -83,10 +86,10 @@ void __fastcall TSpyForm::SpyTimerTick(TObject *Sender)
     char    buf[1024];
     int     rd;
 
-    if(*spybuf==NULL)
+    if(*outbuf==NULL)
         return;
 
-    rd=RingBufRead(*spybuf,buf,sizeof(buf)-1);
+    rd=RingBufRead(*outbuf,buf,sizeof(buf)-1);
     if(rd) {
 #if 0
         buf[rd]=0;
@@ -105,13 +108,15 @@ void __fastcall TSpyForm::SpyTimerTick(TObject *Sender)
 //---------------------------------------------------------------------------
 void __fastcall TSpyForm::FormShow(TObject *Sender)
 {
-    Terminal->Font=MainForm->SpyTerminalFont;
-    if((*spybuf=(RingBuf*)malloc(sizeof(RingBuf)))==NULL) {
+    if((*outbuf=(RingBuf*)malloc(sizeof(RingBuf)))==NULL) {
         Terminal->WriteStr("Malloc failure!");
         return;
     }
-    RingBufInit(*spybuf,SPYBUF_LEN);
+    RingBufInit(*outbuf,SPYBUF_LEN);
+
     Timer->Enabled=true;
+
+    Terminal->Font=MainForm->SpyTerminalFont;
     Terminal->Clear();
     Terminal->WriteStr("*** Synchronet Local Spy ***\r\n\r\n");
     Terminal->WriteStr("ANSI Terminal Emulation:"+CopyRight+"\r\n\r\n");
@@ -121,17 +126,18 @@ void __fastcall TSpyForm::FormShow(TObject *Sender)
 void __fastcall TSpyForm::FormClose(TObject *Sender, TCloseAction &Action)
 {
     Timer->Enabled=false;
-    if(*spybuf!=NULL) {
-        RingBufDispose(*spybuf);
-        free(*spybuf);
-        *spybuf=NULL;
+    if(*outbuf!=NULL) {
+        RingBufDispose(*outbuf);
+        free(*outbuf);
+        *outbuf=NULL;
     }
     MainForm->SpyTerminalWidth=Width;
     MainForm->SpyTerminalHeight=Height;
+    MainForm->SpyTerminalKeyboardActive=KeyboardActive->Checked;
 }
 //---------------------------------------------------------------------------
 
-void __fastcall TSpyForm::FontMenuItemClick(TObject *Sender)
+void __fastcall TSpyForm::ChangeFontClick(TObject *Sender)
 {
 	TFontDialog *FontDialog=new TFontDialog(this);
 
@@ -140,8 +146,29 @@ void __fastcall TSpyForm::FontMenuItemClick(TObject *Sender)
     MainForm->SpyTerminalFont->Assign(FontDialog->Font);
     Terminal->Font=MainForm->SpyTerminalFont;
     delete FontDialog;
-//    Terminal->Clear();
     Terminal->UpdateScreen();
 }
 //---------------------------------------------------------------------------
 
+void __fastcall TSpyForm::FormKeyPress(TObject *Sender, char &Key)
+{
+    if(KeyboardActive->Checked && inbuf!=NULL && *inbuf!=NULL)
+        RingBufWrite(*inbuf,&Key,1);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TSpyForm::KeyboardActiveClick(TObject *Sender)
+{
+    KeyboardActive->Checked=!KeyboardActive->Checked;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TSpyForm::FormMouseUp(TObject *Sender, TMouseButton Button,
+      TShiftState Shift, int X, int Y)
+{
+    if(Button==mbRight)
+        PopupMenu->Popup(ClientOrigin.x+X,ClientOrigin.y+Y);
+}
+//---------------------------------------------------------------------------
+
+
diff --git a/src/sbbs3/ctrl/SpyFormUnit.dfm b/src/sbbs3/ctrl/SpyFormUnit.dfm
index 7dc23f3f9022337fcf84f46a43e020168e0c3510..f887c61b77b505ef81d0a8da5d0b8df628d9bba1 100644
--- a/src/sbbs3/ctrl/SpyFormUnit.dfm
+++ b/src/sbbs3/ctrl/SpyFormUnit.dfm
@@ -41,6 +41,8 @@ object SpyForm: TSpyForm
   OldCreateOrder = False
   Position = poDefaultPosOnly
   OnClose = FormClose
+  OnKeyPress = FormKeyPress
+  OnMouseUp = FormMouseUp
   OnShow = FormShow
   PixelsPerInch = 96
   TextHeight = 13
@@ -197,9 +199,36 @@ object SpyForm: TSpyForm
   object SpyMenu: TMainMenu
     Left = 288
     Top = 24
-    object FontMenuItem: TMenuItem
-      Caption = 'Font'
-      OnClick = FontMenuItemClick
+    object SettingsMenuItem: TMenuItem
+      Caption = 'Settings'
+      object KeyboardActiveMenuItem: TMenuItem
+        Action = KeyboardActive
+      end
+      object FontMenuItem: TMenuItem
+        Action = ChangeFont
+      end
+    end
+  end
+  object PopupMenu: TPopupMenu
+    Left = 80
+    Top = 104
+    object KeyboardActivePopupMenuItem: TMenuItem
+      Action = KeyboardActive
+    end
+    object FontPopupMenuItem: TMenuItem
+      Action = ChangeFont
+    end
+  end
+  object ActionList: TActionList
+    Left = 328
+    Top = 24
+    object KeyboardActive: TAction
+      Caption = 'Keyboard Active'
+      OnExecute = KeyboardActiveClick
+    end
+    object ChangeFont: TAction
+      Caption = 'Font...'
+      OnExecute = ChangeFontClick
     end
   end
 end
diff --git a/src/sbbs3/ctrl/SpyFormUnit.h b/src/sbbs3/ctrl/SpyFormUnit.h
index 40089170f06bf4edbedbfec01b9812b2fca67613..921814dda5b7f6055a00e2e8940569d860e60e6f 100644
--- a/src/sbbs3/ctrl/SpyFormUnit.h
+++ b/src/sbbs3/ctrl/SpyFormUnit.h
@@ -15,6 +15,7 @@
 #include <ImgList.hpp>
 #include <ToolWin.hpp>
 #include <Menus.hpp>
+#include <ActnList.hpp>
 //---------------------------------------------------------------------------
 class TSpyForm : public TForm
 {
@@ -22,15 +23,28 @@ __published:	// IDE-managed Components
     TTimer *Timer;
     TImageList *ImageList;
     TMainMenu *SpyMenu;
+    TMenuItem *SettingsMenuItem;
+    TMenuItem *KeyboardActiveMenuItem;
     TMenuItem *FontMenuItem;
+    TPopupMenu *PopupMenu;
+    TMenuItem *KeyboardActivePopupMenuItem;
+    TActionList *ActionList;
+    TAction *KeyboardActive;
+    TAction *ChangeFont;
+    TMenuItem *FontPopupMenuItem;
     void __fastcall SpyTimerTick(TObject *Sender);
     void __fastcall FormShow(TObject *Sender);
     void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
-    void __fastcall FontMenuItemClick(TObject *Sender);
+    void __fastcall ChangeFontClick(TObject *Sender);
+    void __fastcall FormKeyPress(TObject *Sender, char &Key);
+    void __fastcall KeyboardActiveClick(TObject *Sender);
+    void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
+          TShiftState Shift, int X, int Y);
 private:	// User declarations
 public:		// User declarations
-    TEmulVT *Terminal;
-    RingBuf** spybuf;
+    TEmulVT*    Terminal;
+    RingBuf**   inbuf;
+    RingBuf**   outbuf;
     __fastcall TSpyForm(TComponent* Owner);
 };
 //---------------------------------------------------------------------------