diff --git a/src/Makefile b/src/Makefile
index 34f294cc..1af67b51 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -279,8 +279,9 @@ endif
     # Use gcc for compiling. Use ncc to build a callgraph and analyze the code.
     #CC = nccgen -ncgcc -ncld -ncfabs
     OBJDIR = ../obj/macosx
+    PLATFORMOBJ = pasteboard.o
 ifeq ($(API),sdl)
-    PLATFORMOBJ = SDLMain.o
+    PLATFORMOBJ += SDLMain.o
 endif
     FCLOPT = 
     MACAPPEXE = Grafx2.app/Contents/MacOS/Grafx2
@@ -860,7 +861,7 @@ release : $(BIN)
 # .tgz archive with source only files
 SRCARCH = ../src-$(VERSIONTAG).tgz
 
-$(SRCARCH):	$(wildcard *.c) $(wildcard *.cpp) $(wildcard *.h) Makefile Makefile.dep gfx2.ico Grafx2_Prefix.pch SDLMain.m gfx2.rc
+$(SRCARCH):	$(wildcard *.c) $(wildcard *.cpp) $(wildcard *.h) Makefile Makefile.dep gfx2.ico Grafx2_Prefix.pch $(wildcard *.m) gfx2.rc
 	cd .. && $(TAR) czf $(SRCARCH:../%=%) $(addprefix src/,$^)
 
 ifeq ($(PLATFORM),Darwin)
@@ -887,7 +888,7 @@ ifeq ($(PLATFORM),Darwin)
 endif
 	$(TAR) czf "../grafx2-$(VERSIONTAG)-src.tgz" $(TARTRANSFORM) \
 	  ../src/*.c ../src/*.cpp ../src/*.h ../src/Makefile ../src/Makefile.dep \
-	  ../src/Grafx2_Prefix.pch ../src/SDLMain.m ../src/gfx2.rc ../src/gfx2.ico \
+	  ../src/Grafx2_Prefix.pch ../src/*.m ../src/gfx2.rc ../src/gfx2.ico \
 	  ../src/Grafx2.icns ../src/English.lproj/* ../src/Info.plist \
 	  ../share/grafx2/gfx2def.ini $(SCRIPT_FILES) $(SKIN_FILES) \
 	  ../share/grafx2/gfx2.gif ../share/grafx2/gfx2.png ../share/icons/grafx2.svg \
diff --git a/src/fileformats.h b/src/fileformats.h
index a510eb32..c1525836 100644
--- a/src/fileformats.h
+++ b/src/fileformats.h
@@ -167,6 +167,7 @@ void Save_HGR(T_IO_Context *);
 void Test_TIFF(T_IO_Context *, FILE *);
 void Load_TIFF(T_IO_Context *);
 void Save_TIFF(T_IO_Context *);
+void Load_TIFF_from_memory(T_IO_Context *, const void *, unsigned long);
 #endif
 
 /// @}
diff --git a/src/filesel.c b/src/filesel.c
index d09fa7f3..c4ec3cb5 100644
--- a/src/filesel.c
+++ b/src/filesel.c
@@ -1733,11 +1733,13 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
     Display_bookmark(bookmark_dropdown[temp],temp);
   }
 
-#if defined(WIN32) || defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
+#if defined(WIN32) || defined(__macosx__) || defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
   if (load)
     Window_set_normal_button(62,180,115,14,"From Clipboard",0,1,SHORTCUT_PASTE); // 14
+#if !defined(__macosx__)
   else
     Window_set_normal_button(62,180,115,14,"To Clipboard",0,1,SHORTCUT_COPY); // 14
+#endif
 #endif
 
   Change_directory(context->File_directory);
diff --git a/src/loadsave.c b/src/loadsave.c
index b6b9d8e3..6f489c84 100644
--- a/src/loadsave.c
+++ b/src/loadsave.c
@@ -86,6 +86,11 @@ extern Window X11_window;
 #endif
 #endif
 
+#if defined(__macosx__)
+const void * get_tiff_paste_board(unsigned long * size);
+#endif
+
+
 #if defined(USE_SDL) || defined(USE_SDL2)
 // -- SDL_Image -------------------------------------------------------------
 // (TGA, BMP, PNM, XPM, XCF, PCX, GIF, JPG, TIF, IFF, PNG, ICO)
@@ -1438,6 +1443,14 @@ static void Load_ClipBoard_Image(T_IO_Context * context)
     }
   }
   CloseClipboard();
+#elif defined(__macosx__)
+  unsigned long size;
+  const void * tiff = get_tiff_paste_board(&size);
+
+  GFX2_Log(GFX2_DEBUG, "TIFF pasteboard : %p (%lu bytes)\n", tiff, size);
+  if (tiff != NULL)
+    Load_TIFF_from_memory(context, tiff, size);
+
 #elif defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
   int i;
   Atom selection;
diff --git a/src/pasteboard.m b/src/pasteboard.m
new file mode 100644
index 00000000..ba04a5d4
--- /dev/null
+++ b/src/pasteboard.m
@@ -0,0 +1,37 @@
+/* vim:expandtab:ts=2 sw=2:
+*/
+/*  Grafx2 - The Ultimate 256-color bitmap paint program
+
+    Copyright 2018 Thomas Bernard
+    Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
+
+    Grafx2 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; version 2
+    of the License.
+
+    Grafx2 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 Grafx2; if not, see 
+*/
+
+///@file pasteboard.m
+/// Support for Mac OS X PasteBoard
+///
+
+#import 
+
+const void * get_tiff_paste_board(unsigned long * size)
+{
+  NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
+  NSLog(@"types in pasteboard : %@", [pasteboard types]);
+  NSData *data = [pasteboard dataForType:NSTIFFPboardType];
+  if (data == nil)
+    return NULL;
+  *size = [data length];
+  return [data bytes];
+}
diff --git a/src/tifformat.c b/src/tifformat.c
index 97403ac8..01db814a 100644
--- a/src/tifformat.c
+++ b/src/tifformat.c
@@ -383,6 +383,99 @@ void Load_TIFF_Sub(T_IO_Context * context, TIFF * tif, unsigned long file_size)
   }
 }
 
+struct memory_buffer
+{
+  char * buffer;
+  unsigned long offset;
+  unsigned long size;
+};
+
+tmsize_t lTIFF_read(thandle_t p, void * data, tmsize_t size)
+{
+  struct memory_buffer * mbuffer = (struct memory_buffer *)p;
+  GFX2_Log(GFX2_DEBUG, "lTIFF_read(%p, %p, %u)\n", p, data, size);
+  memcpy(data, mbuffer->buffer + mbuffer->offset, size);
+  mbuffer->offset += size;
+  return size;
+}
+
+tmsize_t lTIFF_write(thandle_t p, void * data, tmsize_t size)
+{
+  struct memory_buffer * mbuffer = (struct memory_buffer *)p;
+  GFX2_Log(GFX2_DEBUG, "lTIFF_write(%p, %p, %u)\n", p, data, size);
+  return -1;
+}
+
+toff_t lTIFF_seek(thandle_t p, toff_t offset, whence)
+{
+  struct memory_buffer * mbuffer = (struct memory_buffer *)p;
+  GFX2_Log(GFX2_DEBUG, "lTIFF_seek(%p, %u, %d)\n", p, offset, whence);
+  switch (whence)
+  {
+    case SEEK_SET:
+      mbuffer->offset = offset;
+      break;
+    case SEEK_CUR:
+      mbuffer->offset += offset;
+      break;
+    case SEEK_END:
+      mbuffer->offset = mbuffer->size - offset;
+      break;
+    default:
+      return -1;
+  }
+  return mbuffer->offset;
+}
+
+
+toff_t lTIFF_size(thandle_t p)
+{
+  struct memory_buffer * mbuffer = (struct memory_buffer *)p;
+  return mbuffer->size;
+}
+
+int lTIFF_close(thandle_t p)
+{
+  (void)p;
+  return 0;
+}
+
+int lTIFF_map(thandle_t p, void ** base, toff_t * size)
+{
+  struct memory_buffer * mbuffer = (struct memory_buffer *)p;
+  GFX2_Log(GFX2_DEBUG, "lTIFF_map(%p, %p, %p)\n", p, base, size);
+  *base = mbuffer->buffer;
+  *size = mbuffer->size;
+  return 1;
+}
+
+void lTIFF_unmap(thandle_t p, void *base, toff_t size)
+{
+  GFX2_Log(GFX2_DEBUG, "lTIFF_unmap(%p, %p, %u)\n", p, base, size);
+  return;
+}
+
+/// Load TIFF from memory
+void Load_TIFF_from_memory(T_IO_Context * context, const void * buffer, unsigned long size)
+{
+  TIFF * tif;
+  struct memory_buffer memory_buffer;
+
+  memory_buffer.buffer = (char *)buffer;
+  memory_buffer.offset = 0;
+  memory_buffer.size = size;
+
+  TIFF_Init();
+  tif = TIFFClientOpen("memory.tiff", "r", &memory_buffer,
+                       lTIFF_read, lTIFF_write, lTIFF_seek, lTIFF_close,
+                       lTIFF_size, lTIFF_map, lTIFF_unmap);
+  if (tif != NULL)
+  {
+    Load_TIFF_Sub(context, tif, size);
+    TIFFClose(tif);
+  }
+}
+
 /// Load TIFF from file
 void Load_TIFF(T_IO_Context * context)
 {